Json概述

1.Json说明:Json是国际通用的一种轻量级的数据交换格式,主要在网络通讯中用于传输数据,或本地数据存储和读取,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率;

2.Json和XML的区别:

  • 共同点:
    • 都是纯文本;
    • 都有层次结构;
    • 都具有描述性;
  • 不同点:
  • Json配置更加简单;
  • Json在某些情况读写更快速;

    Json文件格式

    Json配置规则

1.注释规则:和C#一模一样;

2.符号含义:

  • 大括号{}:对象;
  • 中括号[]:数组;
  • 冒号::键值对对应关系;
  • 逗号,:数据分割;
  • 双引号””:键名/字符串;
    Json数据和类对象的对应关系

Excel转Json的网站

1.Excel转Json的网站
在线Excel、CSV转JSON格式-BeJSON.com

2.自己写编辑器工具去转换

C#存取Json文件

JsonUtlity

1.JsonUtlity是什么?
        //JsonUtlity 是Unity自带的用于解析Json的公共类
        //它可以
        //1.将内存中对象序列化为Json格式的字符串
        //2.将Json字符串反序列化为类对象

2.必备知识点——在文件中存读字符串
        //1.存储字符串到指定路径文件中
        //第一个参数 填写的是 存储的路径
        //第二个参数 填写的是 存储的字符串内容
        //注意:第一个参数 必须是存在的文件路径 如果没有对应文件夹 会报错
        File.WriteAllText(Application.persistentDataPath + "/Test.json", "存储的json文件");
        print(Application.persistentDataPath);

        //2.在指定路径文件中读取字符串
        string str = File.ReadAllText(Application.persistentDataPath + "/Test.json");

3.使用JsonUtlity进行序列化
        //序列化:把内存中的数据 存储到硬盘上
        //方法:JsonUtility.ToJson(对象)
        //Jsonutility提供了现成的方法 可以把类对象 序列化为 json字符串
        string jsonStr = JsonUtility.ToJson(t);
        File.WriteAllText(Application.persistentDataPath + "/MrTang.json", jsonStr);

        //注意:
        //1.float序列化时看起来会有一些误差
        //2.自定义类需要加上序列化特性[System.Serializable]
        //3.想要序列化私有变量 需要加上特性[SerializeField]
        //4.JsonUtility不支持字典
        //5.JsonUtlity存储null对象不会是null 而是默认值的数据

4.使用JsonUtlity进行反序列化
        //反序列化:把硬盘上的数据 读取到内存中
        //方法:
        //JsonUtility.FromJson(字符串)
        //读取文件中的 Json字符串
        jsonStr = File.ReadAllText(Application.persistentDataPath + "/MrTang.json");
        //使用Json字符串内容 转换成类对象
        MrTang t2 = JsonUtility.FromJson(jsonStr, typeof(MrTang)) as MrTang;
        MrTang t3 = JsonUtility.FromJson<MrTang>(jsonStr);

        //注意:
        //如果Json中数据少了,读取到内存中类对象中时不会报错

5.注意事项
        //1.JsonUtlity无法直接读取数据集合,要用一个类去包裹数组可以(如下图)
        jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo2.json");
        print(jsonStr);
        //List<RoleInfo> roleInfoList = JsonUtility.FromJson<List<RoleInfo>>(jsonStr);
        RoleData data = JsonUtility.FromJson<RoleData>(jsonStr);

        //2.文本编码格式需要时UTF-8 不然无法加载

JsonUtlity不能读取数组的问题

LitJson

LitJSON下载地址(github.com)

1.LitJson是什么
        //它是一个第三方库,用于处理Json的序列化和反序列化
        //LitJson是C#编写的,体积小、速度快、易于使用
        //它可以很容易的嵌入到我们的代码中
        //只需要将LitJson代码拷贝到工程中即可

2.使用LitJson进行序列化
        //方法:JsonMapper.ToJson(对象)
        string jsonStr = JsonMapper.ToJson(t);
        print(Application.persistentDataPath);
        File.WriteAllText(Application.persistentDataPath + "/MrTang2.json", jsonStr);

        //注意:
        //1.相对JsonUtlity不需要加特性
        //2.不能序列化私有变量
        //3.支持字典类型,字典的键 建议都是字符串 因为 Json的特点 Json中的键会加上双引号
        //4.需要引用LitJson命名空间
        //5.LitJson可以准确的保存null类型

3.使用LitJson反序列化
        //方法:JsonMapper.ToObject(字符串)
        jsonStr = File.ReadAllText(Application.persistentDataPath + "/MrTang2.json");
        //JsonData是LitJson提供的类对象 可以用键值对的形式去访问其中的内容
        JsonData data = JsonMapper.ToObject(jsonStr);
        print(data["name"]);
        print(data["age"]);
        //通过泛型转换 更加的方便 建议使用这种方式
        MrTang2 t2 = JsonMapper.ToObject<MrTang2>(jsonStr);

        //注意:
        //1.类结构需要无参构造函数,否则反序列化时报错
        //2.字典虽然支持 但是键在使用为数值时会有问题 需要使用字符串类型

4.注意事项
        //1.LitJson可以直接读取数据集合(记住最后不用写逗号)
        jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo.json");
        RoleInfo2[] arr = JsonMapper.ToObject<RoleInfo2[]>(jsonStr);

        List<RoleInfo2> list = JsonMapper.ToObject<List<RoleInfo2>>(jsonStr);

        jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/Dic.json");
        Dictionary<string, int> dicTest = JsonMapper.ToObject<Dictionary<string, int>>(jsonStr);

        //2.文本编码格式需要是UTF-8 不然无法加载

俩种方法对比

1.JsonUtlity和LitJson相同点
        //1.他们都是用于Json的序列化反序列化
        //2.Json文档编码格式必须是UTF-8
        //3.都是通过静态类进行方法调用
2.JsonUtlity和LitJson不同点
        //1.JsonUtlity是Unity自带,LitJson是第三方需要引用命名空间
        //2.JsonUtlity使用时自定义类需要加特性,LitJson不需要
        //3.JsonUtlity支持私有变量(加特性),LitJson不支持
        //4.JsonUtlity不支持字典,LitJson支持(但是键只能是字符串)
        //5.JsonUtlity不能直接将数据反序列化为数据集合(数组字典),LitJson可以
        //6.JsonUtlity对自定义类不要求有无参构造,LitJson需要
        //7.JsonUtlity存储空对象时会存储默认值而不是null,LitJson会存null
3.如何选择两者
        //根据实际需求
        //建议使用LitJson
        //原因:LitJson不用加特性,支持字典,支持直接反序列化为数据集合,存储null更准确