5.LitJson

5.CSharp操作Json-LitJson


5.1 知识点

LitJson是什么

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

获取LitJson

前往LitJson官网 https://litjson.net/

通过官网前往GitHub获取最新版本代码


只要代码 其他图片什么的都可以删掉


使用LitJson进行序列化

准备一个类和对象实例

测试类
public class Student2
{
    public int age;
    public string name;

    public Student2() { }

    public Student2(int age, string name)
    {
        this.age = age;
        this.name = name;
    }
}

public class MrTao2
{
    public string name;
    public int age;
    public bool sex;
    public float testF;
    public double testD;

    public int[] ids;
    public List<int> ids2;
    //public Dictionary<int, string> dic;
    public Dictionary<string, string> dic2;

    public Student2 s1;
    public List<Student2> s2s;

    private int privateI = 1;
    protected int protectedI = 2;
}
实例
MrTao2 t = new MrTao2();
t.name = "韬老狮";
t.age = 18;
t.sex = true;
t.testF = 1.4f;
t.testD = 1.4;

t.ids = new int[] { 1, 2, 3, 4 };
t.ids2 = new List<int>() { 1, 2, 3 };
//t.dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "234" } };
t.dic2 = new Dictionary<string, string>() { { "1", "123" }, { "2", "234" } };

t.s1 = null;//new Student(1, "小红");
t.s2s = new List<Student2>() { new Student2(2, "小明"), new Student2(3, "小强") };

JsonMapper.ToJson方法 序列化对象

//JsonMapper类中的ToJson方法 序列化对象
//JsonMapper.ToJson(对象)
string jsonStr = JsonMapper.ToJson(t);
print(Application.persistentDataPath);
File.WriteAllText(Application.persistentDataPath + "/MrTao2.json", jsonStr);

LitJson序列化时注意事项

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

查看序列化后的json文件

{"name":"\u97EC\u8001\u72EE","age":18,"sex":true,"testF":1.4,"testD":1.4,"ids":[1,2,3,4],"ids2":[1,2,3],"dic2":{"1":"123","2":"234"},"s1":null,"s2s":[{"age":2,"name":"\u5C0F\u660E"},{"age":3,"name":"\u5C0F\u5F3A"}]}

使用LitJson反序列化

读取对应路径下文件中的Json字符串

jsonStr = File.ReadAllText(Application.persistentDataPath + "/MrTao2.json");

JsonMapper.ToObject方法 反序列化对象

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

LitJson进行反序列化时注意事项

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

LitJson中的注意事项

LitJson可以直接读取数据集合

public class RoleInfo2
{
    public int hp;
    public int speed;
    public int volume;
    public string resName;
    public int scale;
}

//读取数组或List
jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo.json");
RoleInfo2[] arr = JsonMapper.ToObject<RoleInfo2[]>(jsonStr);
List<RoleInfo2> list = JsonMapper.ToObject<List<RoleInfo2>>(jsonStr);

//读取键为string类型的字典
jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/Dic.json");
Dictionary<string, int> dicTest = JsonMapper.ToObject<Dictionary<string, int>>(jsonStr);

注意检测json文件最后一行会不会多了一个逗号

文本编码格式需要是UTF-8,否则无法加载

总结

  • LitJson提供的序列化反序列化方法 JsonMapper.ToJson和ToObject<>
  • LitJson无需加特性
  • LitJson不支持私有变量
  • LitJson支持字典序列化反序列化
  • LitJson可以直接将数据反序列化为数据集合
  • LitJson反序列化时 自定义类型需要无参构造
  • Json文档编码格式必须是UTF-8

5.2 知识点代码

using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class Student2
{
    public int age;
    public string name;

    public Student2() { }

    public Student2(int age, string name)
    {
        this.age = age;
        this.name = name;
    }
}

public class MrTao2
{
    public string name;
    public int age;
    public bool sex;
    public float testF;
    public double testD;

    public int[] ids;
    public List<int> ids2;
    //public Dictionary<int, string> dic;
    public Dictionary<string, string> dic2;

    public Student2 s1;
    public List<Student2> s2s;

    private int privateI = 1;
    protected int protectedI = 2;
}

public class RoleInfo2
{
    public int hp;
    public int speed;
    public int volume;
    public string resName;
    public int scale;
}

public class Lesson05_CSharp读取存储Json文件_LitJson : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 LitJson是什么?
        //它是一个第三方库,用于处理Json的序列化和反序列化
        //LitJson是C#编写的,体积小、速度快、易于使用
        //它可以很容易的嵌入到我们的代码中
        //只需要将LitJson代码拷贝到工程中即可
        #endregion

        #region 知识点二 获取LitJson
        //1.前往LitJson官网 https://litjson.net/
        //2.通过官网前往GitHub获取最新版本代码
        //3.将代码拷贝到Unity工程中 即可开始使用LitJson 注意不要把解压的全部工程都拷贝 拷贝src目录下的LitJson文件夹即可
        #endregion

        #region 知识点三 使用LitJson进行序列化

        //准备一个类和对象实例
        MrTao2 t = new MrTao2();
        t.name = "韬老狮";
        t.age = 18;
        t.sex = true;
        t.testF = 1.4f;
        t.testD = 1.4;

        t.ids = new int[] { 1, 2, 3, 4 };
        t.ids2 = new List<int>() { 1, 2, 3 };
        //t.dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "234" } };
        t.dic2 = new Dictionary<string, string>() { { "1", "123" }, { "2", "234" } };

        t.s1 = null;//new Student(1, "小红");
        t.s2s = new List<Student2>() { new Student2(2, "小明"), new Student2(3, "小强") };


        //JsonMapper类中的ToJson方法 序列化对象
        //JsonMapper.ToJson(对象)
        string jsonStr = JsonMapper.ToJson(t);
        print(Application.persistentDataPath);
        File.WriteAllText(Application.persistentDataPath + "/MrTao2.json", jsonStr);

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

        #region 知识点四 使用LitJson反序列化

        //读取文件中的 Json字符串
        jsonStr = File.ReadAllText(Application.persistentDataPath + "/MrTao2.json");

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

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

        #region 知识点五 LitJson中的注意事项
        
        //LitJson可以直接读取数据集合

        //读取数组或List
        jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo.json");
        RoleInfo2[] arr = JsonMapper.ToObject<RoleInfo2[]>(jsonStr);
        List<RoleInfo2> list = JsonMapper.ToObject<List<RoleInfo2>>(jsonStr);

        //读取键为string类型的字典
        jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/Dic.json");
        Dictionary<string, int> dicTest = JsonMapper.ToObject<Dictionary<string, int>>(jsonStr);

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

        #region 总结
        //1.LitJson提供的序列化反序列化方法 JsonMapper.ToJson和ToObject<>
        //2.LitJson无需加特性
        //3.LitJson不支持私有变量
        //4.LitJson支持字典序列化反序列化
        //5.LitJson可以直接将数据反序列化为数据集合
        //6.LitJson反序列化时 自定义类型需要无参构造
        //7.Json文档编码格式必须是UTF-8
        #endregion
    }
}

5.3 练习题

有一个玩家数据类,请为该类写一个方法结合LitJson知识点,完成对象的序列化和反序列化

声明物品类和玩家信息类,可以不用添加特性,保证自定义类有无参构造函数
/// <summary>
/// 物品类
/// </summary>
public class Item2
{
    public int id;   // 物品ID
    public int num;  // 物品数量

    /// <summary>
    /// 无参构造方法
    /// </summary>
    public Item2() { }

    /// <summary>
    /// 带参构造方法
    /// </summary>
    /// <param name="id">物品ID</param>
    /// <param name="num">物品数量</param>
    public Item2(int id, int num)
    {
        this.id = id;
        this.num = num;
    }
}

/// <summary>
/// 玩家信息类
/// </summary>
public class PlayerInfo2
{
    public string name;                  // 玩家姓名
    public int atk;                      // 攻击力
    public int def;                      // 防御力
    public float moveSpeed;              // 移动速度
    public double roundSpeed;            // 回合速度
    public Item2 weapon;                 // 武器
    public List<int> listInt;           // 整型列表
    public List<Item2> itemList;        // 物品列表
    public Dictionary<string, Item2> itemDic2;  // 字典

    /// <summary>
    /// 无参构造方法
    /// </summary>
    public PlayerInfo2() { }
}
创建一个玩家对象并设置其属性
// 创建玩家信息对象
PlayerInfo2 player = new PlayerInfo2();
player.name = "韬老狮";
player.atk = 11;
player.def = 5;
player.moveSpeed = 20.5f;
player.roundSpeed = 21.4;

player.weapon = null;

player.listInt = new List<int>() { 1, 2, 3, 4, 5 };
player.itemList = new List<Item2>() { new Item2(1, 99), new Item2(2, 44) };

player.itemDic2 = new Dictionary<string, Item2>() { { "1", new Item2(1, 12) }, { "2", new Item2(2, 22) } };
创建序列化对象并保存为JSON文件的方法并调用
/// <summary>
/// 序列化对象并保存为JSON文件
/// </summary>
/// <param name="data">要序列化的对象</param>
/// <param name="path">保存的文件路径</param>
public void SaveData(PlayerInfo2 data, string path)
{
    // 将对象序列化为JSON字符串
    string jsonStr = JsonMapper.ToJson(data);

    // 打印持久化数据的路径
    print(Application.persistentDataPath);

    // 将JSON字符串写入指定路径的文件中
    File.WriteAllText(Application.persistentDataPath + "/" + path + ".json", jsonStr);
}

// 调用SaveData方法,将玩家信息对象序列化为JSON字符串,并保存为JSON文件
SaveData(player, "PlayerInfo2");
创建加载JSON文件并反序列化为玩家对象的方法并调用
/// <summary>
/// 加载JSON文件并反序列化为对象
/// </summary>
/// <param name="path">要加载的文件路径</param>
/// <returns>反序列化后的对象</returns>
public PlayerInfo2 LoadData(string path)
{
    // 读取JSON文件内容
    string jsonStr = File.ReadAllText(Application.persistentDataPath + "/" + path + ".json");

    // 将JSON字符串反序列化为对象
    return JsonMapper.ToObject<PlayerInfo2>(jsonStr);
}

// 调用LoadData方法,加载JSON文件,并将其反序列化为玩家信息对象
PlayerInfo2 p = LoadData("PlayerInfo2");

5.4 练习题代码

using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

/// <summary>
/// 物品类
/// </summary>
public class Item2
{
    public int id;   // 物品ID
    public int num;  // 物品数量

    /// <summary>
    /// 无参构造方法
    /// </summary>
    public Item2() { }

    /// <summary>
    /// 带参构造方法
    /// </summary>
    /// <param name="id">物品ID</param>
    /// <param name="num">物品数量</param>
    public Item2(int id, int num)
    {
        this.id = id;
        this.num = num;
    }
}

/// <summary>
/// 玩家信息类
/// </summary>
public class PlayerInfo2
{
    public string name;                  // 玩家姓名
    public int atk;                      // 攻击力
    public int def;                      // 防御力
    public float moveSpeed;              // 移动速度
    public double roundSpeed;            // 回合速度
    public Item weapon;                   // 武器
    public List<int> listInt;            // 整型列表
    public List<Item2> itemList;         // 物品列表
    public Dictionary<string, Item2> itemDic2;  // 字典

    /// <summary>
    /// 无参构造方法
    /// </summary>
    public PlayerInfo2() { }
}

/// <summary>
/// 练习题场景主脚本
/// </summary>
public class Lesson05_练习题 : MonoBehaviour
{
    #region 练习题一 
    // 有一个玩家数据类
    // 请为该类写一个方法结合LitJson知识点
    // 完成对象的序列化和反序列化

    /// <summary>
    /// 当游戏开始时调用的方法
    /// </summary>
    void Start()
    {
        // 创建玩家信息对象
        PlayerInfo2 player = new PlayerInfo2();
        player.name = "韬老狮";
        player.atk = 11;
        player.def = 5;
        player.moveSpeed = 20.5f;
        player.roundSpeed = 21.4;

        player.weapon = null;

        player.listInt = new List<int>() { 1, 2, 3, 4, 5 };
        player.itemList = new List<Item2>() { new Item2(1, 99), new Item2(2, 44) };

        player.itemDic2 = new Dictionary<string, Item2>() { { "1", new Item2(1, 12) }, { "2", new Item2(2, 22) } };

        // 调用SaveData方法,将玩家信息对象序列化为JSON字符串,并保存为JSON文件
        SaveData(player, "PlayerInfo2");

        // 调用LoadData方法,加载JSON文件,并将其反序列化为玩家信息对象
        PlayerInfo2 p = LoadData("PlayerInfo2");
    }

    /// <summary>
    /// 序列化对象并保存为JSON文件
    /// </summary>
    /// <param name="data">要序列化的对象</param>
    /// <param name="path">保存的文件路径</param>
    public void SaveData(PlayerInfo2 data, string path)
    {
        // 将对象序列化为JSON字符串
        string jsonStr = JsonMapper.ToJson(data);

        // 打印持久化数据的路径
        print(Application.persistentDataPath);

        // 将JSON字符串写入指定路径的文件中
        File.WriteAllText(Application.persistentDataPath + "/" + path + ".json", jsonStr);
    }

    /// <summary>
    /// 加载JSON文件并反序列化为对象
    /// </summary>
    /// <param name="path">要加载的文件路径</param>
    /// <returns>反序列化后的对象</returns>
    public PlayerInfo2 LoadData(string path)
    {
        // 读取JSON文件内容
        string jsonStr = File.ReadAllText(Application.persistentDataPath + "/" + path + ".json");

        // 将JSON字符串反序列化为对象
        return JsonMapper.ToObject<PlayerInfo2>(jsonStr);
    }

    #endregion
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏