声明:
本帖仅为个人学习笔记,且本人表达可能不准确,如有帮助最好不过,写得不好请见谅,另欢迎各位大佬补充和纠错,多谢支持
关于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
综合得出来的结果,应为仅按照两者中的任何一个都有许多坑,这里不再赘述,大家可以去官方文档里面看看有没有更简单的方法实现这个效果