使用其他的Json解析工具可能会有问题,比如:
1.Unity自带的JsonUtility不能解析复杂嵌套的json字符串
通过上述描述,可知使用该类是需要相应的有一个类并且这个类是标记了[Serializable],类字段也是必须是可序列化的,私有的字段或者被标记[NonSerialized]的字段将被忽略。
注意:
2. LitJson Key和类字段名称需完全一致
还提供了stream的方式处理JSON数据,提供的接口是jsonreader和jsonwriter。LitJson这个插件功能很强大可以完成更复杂的json字符串的解析。
但是也有个缺点就是:json字符串中的key也需要和类字段的名字完全一致,如果不对应的话会解析失败。
Newtonsoft.Json:
Json.Net功能强大,可以完成复杂的json字符串解析,并且性能相当出色。不存在上述缺点。
下载地址:传送门
Mono 平台支持 .net 3.5,Unity的Api要设置为.NET 2.0
否则AS查看log会看到错误:
Could not load type 'Newtonsoft.Json.Linq.JObject' from assembly 'Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'.
Parse error on line 932:
...ssions": 329 }],[ { "m
---------------------^
Expecting 'EOF'
解决办法:
正确写法:
{
"response1": [
{"some": "object"},
{"some": "object"}
],
"response2": [
{"some": "object"},
{"some": "object"}
]
}
要解析的Json内容:
[ { "type": "Feature", "properties": { "Name": null, "GuoBiao": "GaosuGonglu", "DefineNumb": 1 }, "geometry": { "type": "LineString", "coordinates": [ [ 113.3456537, 23.105271 ], [ 113.3455005, 23.1037158 ], [ 113.345485, 23.1028259 ] ] } }, { "type": "Feature", "properties": { "Name": "兴南大道", "GuoBiao": "2JiDaolu", "DefineNumb": 4 }, "geometry": { "type": "LineString", "coordinates": [ [ 113.3074994, 23.0168577 ], [ 113.3076886, 23.0168181 ] ] } }]
解析的代码:
using UnityEngine;
using Newtonsoft.Json.Linq;
public class Skode_NewtonsoftJsonDes : MonoBehaviour {
//要解析的Json内容
public string content;
void Start () {
//获得Json数组:一个Json文件根目录可能有多个类。
JArray jArray = JArray.Parse(content);
//得到字符串 jArray[0]:获得第一个类
string p1 = jArray[0].ToString();
//解析Json的一个完整段落
//data,你可以通过类似于读取字典的方式,在方扩号里填入标签名称,进而就可以得到相应便签中的字符串
JObject data = JObject.Parse(p1);
//得到geometry目录下的字符串
string geometry = data["geometry"].ToString();
//我们想要获取一个子标签时,首先要解析其上一层的父标签,就像一层层剥洋葱一样。我们最终想要获取coordinates标签下的东西,那么还得再写一层:
JObject g = JObject.Parse(geometry);
string coordinates = g["coordinates"].ToString();
//如何将这段拥有多个方括号的字符串转变成想要的数组呢?再次使用神器JArray,它能自动识别出这段字符串为二维数组:
JArray array = JArray.Parse(coordinates);
Debug.Log(array[0].ToString()); //结果:[113.3456537,23.105271]
Debug.Log(array[0][1].ToString()); //结果: 23.105271
}
//当然,JArray和JObject类型的数据,除了ToString,还可以ToDouble和ToSingle等,要视具体情况而定。
}
解析数据:
{
"0": {
"name": "云南有机猕猴桃",
"price": "19.9元/盒",
"date_product": "2019.9.17",
"date_end": "2019.10.18",
"num": "3"
},
"1": {
"name": "凯特芒果",
"price": "15.9元/粒",
"date_product": "2019.9.17",
"date_end": "2019.10.18",
"num": "3"
},
"2": {
"name": "嘉定巨玫瑰葡萄",
"price": "29.9元/盒",
"date_product": "2019.9.17",
"date_end": "2019.10.18",
"num": "3"
}
}
解析代码:
注意:要获得键值对的值,输入的键要是string类型。
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using UnityEngine;
public class Skode_JsonDes : MonoBehaviour {
public static Skode_JsonDes instance;
void Awake()
{
instance = this;
}
public List<Msg> Skode_GetMsg(string str)
{
//获得Json数组:一个Json文件根目录可能有多个类。
JObject jArray = JObject.Parse(str);
var value = new List<Msg>();
for (int i = 0; i < jArray.Count; i++)
{
//得到字符串 jArray[0]:获得第一个类
string p1 = jArray[i.ToString()].ToString();
//解析Json的一个完整段落
JObject data = JObject.Parse(p1);
Msg msg = new Msg();
value.Add(msg);
//得到geometry目录下的字符串
value[i].name = data["name"].ToString();
value[i].price = data["price"].ToString();
value[i].date_product = data["date_product"].ToString();
value[i].date_end = data["date_end"].ToString();
value[i].num = data["num"].ToString();
}
return value;
}
}
public class Msg
{
public string name;
public string price;
public string date_product;
public string date_end;
public string num;
}
大家还有什么问题,欢迎在下方留言!