【Unity3D日常开发】Unity3D中复杂Json结构的生成与解析--List<List<int>>--Dic<int,List<List<int>>>
  4UZE4BBN2hyC 2023年11月02日 59 0

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

最近有小伙伴在群里询问复杂Json格式应该怎么解析和生成。

比如:

  • ​List<List<int>>​
  • ​Dictionary<int, List<int>>​
  • ​Dictionary<int, Dictionary<string, string>>​
  • ​Dictionary<int, Dictionary<string, List<int>>>​

是不是看一眼都懵了,毕竟我们影响中的Json格式应该是这样的:

一个类中有多个int、string字段:

[System.Serializable]
class Person
{
public string Name;
public int Grade;
}

或者这样的,一个类中有多个int、string字段,然后有个数组或者List进行多条Json保存:

[System.Serializable]
class Person
{
public string Name;
public int Grade;
}
[System.Serializable]
class Data1
{
public Person[] Person;
}

生成的Json结构是这样的:

【Unity3D日常开发】Unity3D中复杂Json结构的生成与解析--List<List<int>>--Dic<int,List<List<int>>>_字段

那么这种List套用List,字典套用字典的应该怎么解决呢?

先来复习一下基本Json结构的生成吧。

二、基本Json解析

基本Json的解析,可以参考我这篇文章:【Unity3D读取数据】(二)Json文件操作(创建、读取、解析、修改)

这里做一个简单回顾。

常见的Json结构,比如:

{"Person":[{"Name":"User0","Grade":50},{"Name":"User1","Grade":51},{"Name":"User2","Grade":52},{"Name":"User3","Grade":53},{"Name":"User4","Grade":54}]}

【Unity3D日常开发】Unity3D中复杂Json结构的生成与解析--List<List<int>>--Dic<int,List<List<int>>>_json_02

Json生成C#实体:

[System.Serializable]
class Person
{
public string Name;
public int Grade;
}
[System.Serializable]
class Data
{
public Person[] Person;
}

可以直接用Unity自带的JsonUtility类进行解析(更完整的代码参考这里):

【Unity3D日常开发】Unity3D中复杂Json结构的生成与解析--List<List<int>>--Dic<int,List<List<int>>>_json格式_03

这样就可以解析了,但是遇到多层数据结构嵌套怎么办呢?

三、复杂Json解析

3-1、​​List<List < int>>结构解析​

这种结构还是很好处理的:

{"PersonAge":[{"Age":[18,19,22,21,18]},{"Age":[18,19,22,21,18]}]}

这种的需要先一层一层分析,从最外层是一个List,里面是一个List< int> ,因为没有办法写成List<List < int>>,就可以将List< int>看成一个自定义类。

[System.Serializable]
class Person2
{
public List<int> Age;
}
[System.Serializable]
class Data2
{
public List<Person2> PersonAge;
}

也就是:


List有个自定义类型,自定义类型里面有个字段List< int>


其他的​​List< List < List < List< int>>>>​​类似,就不累述了。

3-2、​​Dictionary<int, List<int>>​

这种结构的Json就有点麻烦了,因为Unity自带的JsonUtility类无法对字典结构进行转Json的操作。

所以就用到了一个非常好用的Json反序列化工具:​​Newtonsoft.Json​

​Newtonsoft.Json​​,是.Net中开源的Json序列化和反序列化工具,功能比较多,效率比较高。

那么我们为什么不一开始就用​​Newtonsoft.Json​​​,因为没有那个必要,Unity自带的JsonUtility类已经可以应对大部分情况,遇到解决不了的就用​​Newtonsoft.Json​​呗。

使用方法:

  • (1)导入Newtonsoft.Json.dll,下载链接
  • (2)导入命名空间:using Newtonsoft.Json;
  • (3)使用​​JsonConvert.SerializeObject​​​将​​实体类数据​​​转成​​Json​
  • (4)使用​​JsonConvert.DeserializeObject​​​将​​Json​​​转成​​实体类数据​

OK,正式开始,我们首先构建一个复杂的Json格式:

[System.Serializable]
public class LocalDataSave
{
public Dictionary<int, List<int>> DicData1;
public Dictionary<int, List<string>> DicData2;
public Dictionary<int, Dictionary<string, string>> DicData3;
public Dictionary<int, Dictionary<string, List<string>>> DicData4;
}

生成测试数据:

using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class LocalDataSave
{
public Dictionary<int, List<int>> DicData1;
public Dictionary<int, List<string>> DicData2;
public Dictionary<int, Dictionary<string, string>> DicData3;
public Dictionary<int, Dictionary<string, List<string>>> DicData4;
}
public class Test_03 : MonoBehaviour
{
void Start()
{
LocalDataSave data = new LocalDataSave();

data.DicData1 = new Dictionary<int, List<int>>();
data.DicData1.Add(0, null);
data.DicData1[0]=new List<int> { 1, 2 };

data.DicData2 = new Dictionary<int, List<string>>();
data.DicData2.Add(0, null);
data.DicData2[0] = new List<string> { "1", "2" };

data.DicData3 = new Dictionary<int, Dictionary<string, string>>();
data.DicData3.Add(0, null);
data.DicData3[0] = new Dictionary<string, string>();
data.DicData3[0].Add("1", "2");

data.DicData4 = new Dictionary<int, Dictionary<string, List<string>>>();
data.DicData4.Add(0, null);
data.DicData4[0] = new Dictionary<string, List<string>>();
data.DicData4[0].Add("1",null);
data.DicData4[0]["1"] = new List<string>();
data.DicData4[0]["1"].Add("1");
data.DicData4[0]["1"].Add("2");

string js = JsonConvert.SerializeObject(data);
Debug.Log(js);
}
}

生成的Json:

{"DicData1":{"0":[1,2]},"DicData2":{"0":["1","2"]},"DicData3":{"0":{"1":"2"}},"DicData4":{"0":{"1":["1","2"]}}}

【Unity3D日常开发】Unity3D中复杂Json结构的生成与解析--List<List<int>>--Dic<int,List<List<int>>>_json_04

注意Dictionary和List的值都需要实例化一下,不然就会报错。

遇到字典里面有List的,比如这种Dictionary<int, List>,需要先​​data.DicData1.Add(0, null);​​添加一个Key值和一个null的Value值,然后再对Value值进行初始化,不然字典中都没有这个Key怎么去初始化呢?

四、总结

这篇文章对各种Json结构的解析和生成进行总结和说明。

总体来说难度不大,主要是生成测试数据的时候,记得Dictionary和List的值需要实例化,其他的就是调用​​JsonConvert.SerializeObject​​API解析数据就行了。

对啦,​​Newtonsoft.Json​​不仅仅就这么点功能,还有很多很强大的功能等待你们去摸索,动手吧少年。



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

4UZE4BBN2hyC