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

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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结构是这样的:
在这里插入图片描述
那么这种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}]}

在这里插入图片描述
Json生成C#实体:

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

可以直接用Unity自带的JsonUtility类进行解析(更完整的代码参考这里):
在这里插入图片描述
这样就可以解析了,但是遇到多层数据结构嵌套怎么办呢?

三、复杂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.DeserializeObjectJson转成实体类数据

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"]}}}

在这里插入图片描述

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

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

四、总结

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

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

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

Guess you like

Origin blog.csdn.net/q764424567/article/details/122474949