数据的本地存储——Json

来源:互联网 发布:采购平台软件 编辑:程序博客网 时间:2024/05/16 03:42

Json的操作和解析:

有两种方式:1、unity5.3之后自带的JSonUtility类库;2、第三方插件LitJSon库。

在unity中创建一个空物体,给空物体加一个脚本如图:

编辑脚本:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using System;

 

/// <summary>

/// Unity自带的JSonUtility

/// </summary>

public class JsonUtilityDemo : MonoBehaviour {

 

void Start () {

 

        //1、JsonUtility类库:

        //使用代码方式创建一个Json

        //例如这样的:{ 'name':'宝宝','age':18} 单引号、双引号都行

 

        Person p1 =new Person();

        p1.name ="宝宝";

        p1.age = 18;

 

        //转成JSon字符串

        string jsonStr = JsonUtility.ToJson(p1);

        //Debug.Log(jsonStr);   //{ "name":"宝宝","age":18}

 

        //再例如这样的:{"Persons":{["name":"宝宝","age":18],["name":"小杰","age":16]}}

        Person p2 =new Person();

        p2.name ="小杰";

        p2.age = 16;

 

        Person[] ps =new Person[] { p1, p2 };

        Persons psons =new Persons();

        psons.persons = ps;

        jsonStr = JsonUtility.ToJson(psons);

        //Debug.Log(jsonStr);   //{"persons":[{"name":"宝宝","age":18},{"name":"小杰","age":16}]}

 

 

        //解析JSon(看传过来的JSon结构,根据JSon结构构造相应的类)

        //比如上面的jsonStr="{"persons":[{"name":"宝宝","age":18},{"name":"小杰","age":16}]}"

        //需要一个persons类,包含person数组,person数组有两个元素,这里已经创建了这两个类

        Persons newPerson = JsonUtility.FromJson<Persons>(jsonStr);

        Debug.Log(newPerson.persons[0].name);  //宝宝

    }

}

/// <summary>

/// Person类

/// unity自带的JsonUtility需要的序列化

/// 这样可以和JSon相互转化

/// </summary>

[Serializable]  

public class Person

{

    public string name;

    public int age;

}

 

[Serializable]

public class Persons

{

    public Person[] persons;

}


2、使用第三方插件LitJSon来创建与解析JSon

下载LitJSon的.dll文件,将dll文件放在Plugins文件夹下,如图:

编辑代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using LitJson;//LitJson命名空间

using System;

 

/// <summary>

/// 利用第三方插件LitJSon来创建与解析JSon

/// </summary>

public class LitJsonDemo : MonoBehaviour {

 

void Start () {

 

        //有两种方法创建和解析JSon:

        // Function1();

 

        // Function2();

 

        Analytic();

 

    }

 

    void Function1()

    {

        //创建JSon(和unity自带的JSonUtility创建相同)

        //比如{"Heros":[{"name":"超人","power":18},{"name":"蝙蝠侠","power":16}]}

        //则先创建符合该类型的类,再创建类的对象

 

        Hero hero1 =new Hero();

        hero1.name ="超人";

        hero1.power = 18;

        Hero hero2 =new Hero();

        hero2.name ="蝙蝠侠";

        hero2.power = 16;

 

        Hero[] hero =new Hero[] { hero1, hero2 };

        Heros hrs =new Heros();

        hrs.heros = hero;

 

        string jsonStr = JsonMapper.ToJson(hrs);

        //Debug.Log(jsonStr);  //打印出中文是UTF8编码,不用管,取出则为正常

 

        //解析JSon 泛型

        Heros newHero = JsonMapper.ToObject<Heros>(jsonStr);

        //Debug.Log(newHero.heros[1].name);  //蝙蝠侠

    }

 

    void Function2()

    {


        //创建JSon

        //比如{"name":"超人","power":18}或者{"heros":[{"name":"超人","power":18},{"name":"蝙蝠侠","power":16}]}

        //不需要创建类直接创建JSon

 

        //1、创建类似这样简单的JSon{ "name":"超人","power":18}

        JsonData creatJsonData =new JsonData();  //JSonData即代表{}也代表[]

 

        //设置JSon类型  如果像这样的一眼可以看出的{"name":"超人","power":18},也可以不需要指定类型,系统会自动识别

        //creatJsonData.SetJsonType(JsonType.Object);

        creatJsonData["name"] ="超人";

        creatJsonData["power"] = 18;

        string json = creatJsonData.ToJson();

        //Debug.Log(json);


        //2、创建类似这样复杂一点的JSon{ "heros":[{"name":"超人","power":18},{"name":"蝙蝠侠","power":16}]}

        JsonData herosJsonData =new JsonData();  //{}代表最外层花括号

        JsonData heroJsonData1 =new JsonData();  //{}内层花括号

        heroJsonData1["name"] ="超人";

        heroJsonData1["power"] = 18;

        JsonData heroJsonData2 =new JsonData();  //{}内层花括号

        heroJsonData2["name"] ="蝙蝠侠";

        heroJsonData2["power"] = 16;

 

        JsonData heros =new JsonData();  //[]heros数组


              heros.SetJsonType(JsonType.Array);//设置JSon类型

        heros.Add(heroJsonData1);

        heros.Add(heroJsonData2);

 

        herosJsonData["heros"] = heros;

 

        Debug.Log(herosJsonData.ToJson());

 

 

        //解析Analytic()

    }

 

    //对第二种方案的解析

    private void Analytic()

    {

        string jsonStr="{ 'Heros':[{'name':'超人','power':18},{'name':'蝙蝠侠','power':16}]}";

 

        JsonData herosJson = JsonMapper.ToObject(jsonStr);

        JsonData heros = herosJson["Heros"];  //[]

        //heros[0]["name"]

        //遍历

       foreach(JsonData heroJsonin heros)

        {

            //Debug.Log(heroJson["name"]);

            //Debug.Log(heroJson["power"]);

 

            Debug.Log(heroJson["name"].ToString());

            Debug.Log((int)heroJson["power"]);

        }

    }

 

 

}

[System.Serializable]

public class Hero

{

    public string name;

    public int power;

}

 

[System.Serializable]

public class Heros

{

    public Hero[] heros;

}