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

Posted 恬静的小魔龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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不仅仅就这么点功能,还有很多很强大的功能等待你们去摸索,动手吧少年。

以上是关于Unity3D日常开发Unity3D中复杂Json结构的生成与解析--List<List<int>>--Dic<int,List<List<int>>>的主要内容,如果未能解决你的问题,请参考以下文章

Unity3D日常开发解析Txt文档,赋值给Text案例

Unity3D日常开发解析Txt文档,赋值给Text案例

Unity3D日常开发Unity3D中实现Excel转XMLJsonCSV文件

Unity3D日常开发Unity3D中实现Excel转XMLJsonCSV文件

Unity3D日常开发Unity3D中实现箭头指向目标点的效果

Unity3D日常开发Unity3D工具之UnityForSVN