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.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"]
注意Dictionary和List的值都需要实例化一下,不然就会报错。
遇到字典里面有List的,比如这种Dictionary<int, List>,需要先data.DicData1.Add(0, null);
添加一个Key值和一个null的Value值,然后再对Value值进行初始化,不然字典中都没有这个Key怎么去初始化呢?
四、总结
这篇文章对各种Json结构的解析和生成进行总结和说明。
总体来说难度不大,主要是生成测试数据的时候,记得Dictionary和List的值需要实例化,其他的就是调用JsonConvert.SerializeObject
API解析数据就行了。
对啦,Newtonsoft.Json
不仅仅就这么点功能,还有很多很强大的功能等待你们去摸索,动手吧少年。
以上是关于Unity3D日常开发Unity3D中复杂Json结构的生成与解析--List<List<int>>--Dic<int,List<List<int>>>的主要内容,如果未能解决你的问题,请参考以下文章
Unity3D日常开发Unity3D中实现Excel转XMLJsonCSV文件
Unity3D日常开发Unity3D中实现Excel转XMLJsonCSV文件