最近遇到了新的需求。由于后端人员数据不规范,导致本该是数组的部分被构建成了对象。由于unity自带的json工具JsonUtility必须要构建相同的类结构才能反序列化,所以这样就出现了一个问题,即数字无法成为参数。我们无法构建这样的数据格式。那就没办法了。只能选择键值对的方式来获取数据
目前支持全平台编译的json工具库比较有名的有三个,分别是:JsonUtility、newtonjson还有LitJson。 其中newtonjson体积过于庞大(250k),而JsonUtility又不支持键值对。所以我们只能选择使用LitJson
如果有对JsonUtility感兴趣的可以看我这篇教程《unity json处理方式 之 JsonUtility 支持包括webgl在内的全平台》
一 安装LitJson
1.1 下载资源
首先到LitJson官网下载unity的package包
2.2 安装
下载完成后,在unity项目打开的情况等下,双击进行package进行资源导入。
二 使用
2.1 序列化方式
LitJson有多个使用方式。方式之一就是数据结构序列化。与JsonUtility一样,我们需要根据json构建数据结构。
2.1.1 object转为json数据
using LitJson
;
[Serializable]
public class Person
{
public string name
;
public int id
;
}
public class JsonTest{
public void ObjectToJson()
{
Person persion1
= new Person();
persion1
.name
= "特朗普";
persion1
.id
= 748;
string jsonStr
= JsonMapper
.ToJson(persion1
);
Debug
.Log("转换后的json字符串是:" + jsonStr
);
Person persion2
= JsonMapper
.ToObject<Person>(jsonStr
);
Debug
.Log("字符串转化成对象后的name数据:" + persion2
.name
);
}
}
2.1.2 json数据专为object
using LitJson
;
public class JsonTest{
public void ObjectToJson()
{
string jsonStr
= @"
{
""name"" : ""alex"",
""id"" : 131231232,
}";
Person persion2
= JsonMapper
.ToObject<Person>(jsonStr
);
Debug
.Log("字符串转化成对象后的name数据:" + persion2
.name
);
}
}
2.2 键值对方式
这是使用最简便的方式。由于使用key>value的方式创建或获取,所以无法再数据结构中加入相应的处理方法。所以使用这种方式一般强调的就只是数据的获取
2.2.1 json的构建
与2.1.1同
2.2.2 json的解析
using LitJson
;
public class jsonTest
{
public void GetJsonData(){
string jsonStr
= @"
{
""name"" : ""alex"",
""id"" : 131231232,
""1"":[
{
""n1"" : ""n1"",
""n2"" : 1
},
{
""n1"" : ""n11"",
""n2"" : 2
}
]
}";
JsonData jsonData
= JsonMapper
.ToObject(jsonStr
);
Debug
.Log("name = " + (string)jsonData
["name"]);
Debug
.Log("id = " + (int)jsonData
["id"]);
JsonData jsonData_array
= jsonData
["1"];
for (int i
= 0; i
< jsonData_array
.Count
; i
++)
{
Debug
.Log("n1 = " + jsonData_array
[i
]["n1"]);
Debug
.Log("n2 = " + (int)jsonData_array
[i
]["n2"]);
}
}
}
关于float,int,等类型的转换问题
有时从json数据转换到float和int时,会产生转换问题,同一个属性,有时系统说是浮点,有时说是整数。 这时只需使用Conver.toXXX(jsondataObject.toString()); 即可成功专用换。重点是先转换成字符串,再转换成数字!