Unity中使用Newtonsoft反序列化Json的一些基本操作

 声明:

本帖仅为个人学习笔记,且本人表达可能不准确,如有帮助最好不过,写得不好请见谅,另欢迎各位大佬补充和纠错,多谢支持

关于Newtonsoft:

官网地址:https://www.newtonsoft.com/json/help/html/SerializingJSON.htm(里面有一些例子,方便各位去学习)

json在线编辑器地址:http://www.bejson.com/oldbejson/jsoneditoronline/(有用,推荐一下)

json转对象基础用法:

比如我想转换下面这一个Json文件:

对象代码如下:其中JsonProperty是用来映射属性到json里面去的,PropertyName就是你要解析的json对象的名字(PS:要转换成DIctionary,json里面格式必须是上图里面的格式,否则会报错)

解析代码如下:

 首先要读取到Json文本,方法就是File.ReadAllText(string path);我的json文件都是放在Resources里的configs下面的;

然后就是通过JsonConvert.DeserializeObject<>(string json);方法来直接解析成对象,<>里面填的是你要解析的对象类型,比如我这里就像解析上图对象的一个列表出来,m_forgeGraohLIst是一个列表,到这里json解析就已经完成了, 你已经获得了相关对象,后面的几句代码是测试的,我们取出列表里面第一个元素的_ForgeItemsId字典里面的1对应的值,其结果应该为2(参照上边的json文件)

测试结果:

 解析部分Json属性值的方法:

还是直接给例子,比如要转换下面这个 json文件:

我现在有一个父类Item,一些子类 继承自它,比如 Consumable,Equipment等,我直接解析出这个json的话它必须是一个列表,而且必须是Item的一个列表,那么我想通过里面每一个对象的 type来生成相应子类就不可能实现,所以这个时候就要先转成JObject 获取到JToken列表来判断,具体本人也不是很清楚,所以直接上代码:

第一步还是一样获取json字符串,然后我们要先将其反序列化为JObject(PS:这里需要using Newtonsoft.Json.Linq,否则没有),然后得到一个JToken的列表,这个列表我个人理解的是里面相当于一个对象,只是说你可以通过 json里面的名字去取到 对应的值,比如上面googleSearch["Items"]它就取到这个名字后面的值,.Children().ToList()则是将其值里面的子对象转换为列表(PS:这里需要using System.Linq,否则没有ToList()方法);

然后就是去遍历这个列表了,可以看到我先是取了JToken对象的"type"的值并转换为ItemType枚举, 然后再switch去对不同type进行处理(PS:Unity里面输入switch后按两下tab,再在()里面填入要判断的变量后再tab,Unity会自动列举出所有情况), 然后我再把这个item转换为对应的子类对象即可。

测试结果:

这个方法我是参考了官方例子:https://www.newtonsoft.com/json/help/html/SerializingJSONFragments.htm 

还有一位大佬的帖子:https://www.cnblogs.com/webenh/p/5745355.html

综合得出来的结果,应为仅按照两者中的任何一个都有许多坑,这里不再赘述,大家可以去官方文档里面看看有没有更简单的方法实现这个效果

猜你喜欢

转载自blog.csdn.net/qq_37421018/article/details/83097329