赞
踩
由于项目中需要Unity和后台服务器间传递数据,而服务器程序采用Java语音编写,所以采用Json作为传递数据格式。
最开始使用Unity自带解决方案,5.3版本以上内置JsonUtility类来进行Json数据的序列化和反序列化,此方案对简单Json数据可以正常处理,但复杂Json数据则无法处理,会报此错误:ArgumentException: JSON must represent an object type。在网上搜索了很长时间也没能解决,遂放弃此方案。
JSON.NET For Unity插件,内部使用了Newtonsoft.Json对Json数据进行处理,对复杂Json数据也可以很好的处理,而且C#中的类可以不用专门指定序列化,比Unity内置的要好用多了。这里也顺便说一下Jsp中写Java语句的注意事项,jsp中定义的类只能在本页面中使用,它实例化的对象不能作为参数传给外部的函数。Java中使用了gson对Json进行处理。
下面举个例子说明一下。
Java中需要被序列化的类有两个属性,一个字符串类型和一个对象数组,然后用gson转为Json字符串传送给Unity。
- public class DataJson {
- public String name;
- public Data[] datas;
- }
- public class Data{
- public Double value;
- public Date time;
- public Integer status;
- }
Unity接收到此Json串后,使用Newtonsoft.Json.Linq对其进行反序列化。
- using Newtonsoft.Json.Linq;
-
- private void getData(string json)
- {
- var jo = JObject.Parse(json);//将json转换为对象
- Data data = jo["datas"][0].ToObject<Data>();//此处Data类和Java中的结构完全一样
- }
由于取Json结构中的对象数组元素比较困难,所以这里只取Json数据中的datas数据,作为示例只取数组中第一个元素,取出后将其转换为Data类型对象,取数组中其他元素只要按此方法遍历即可。当然,要完全还原成DataJson类的结构还需要一些处理,但那已经很容易了,这里就省略掉了。这属于自定义的反序列化方式,如果使用默认方式是取不到 对象数组的值的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。