【Unity】使用JSONObject解析Json
为何要用JSONObject
之前已经用过JsonUtility和Newton.Json来解析Json了,为什么现在又要用一个新的JSONObject来解析Json?
- 使用JsonUtility:http://www.cnblogs.com/guxin/p/unity-jsonutility-parse-list-object.html
- 使用Newton.Json:http://www.cnblogs.com/guxin/p/csharp-parse-json-by-newtonsoft-json-net.html
在Unity游戏开发中,使用Newton.Json来反序列化时,需要指定确定的类型,这会带来什么问题?
在游戏的道具系统中,有一个父类Item类,包含属性ID和Name,有一个子类Consumable消耗品类,包含属性HP和MP,UML如下:

后端返回的物品信息Json如下:
[
{
"id": ,
"name": "血瓶",
"type": "Consumable",
"hp": ,
"mp": ,
},
{
"id": ,
"name": "蓝瓶",
"type": "Consumable",
"hp": ,
"mp": ,
}
]
使用Newton.Json时,代码如下:
// itemsJson是包含了物品信息的Json字符串
public void ParseItemJson(string itemsJson)
{
List<Item> itemList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Item>>(itemsJson); foreach (Item temp in itemList)
{
int id = temp.ID;
string name = temp.Name;
Item.ItemType type = temp.Type; Item item = null;
switch (type)
{
case Item.ItemType.Consumable:
Consumable consumable = temp as Consumable;
int hp = consumable.HP;
int mp = consumable.MP;
item = new Consumable(id, name, type, hp, mp);
break;
// 其他类型省略。。。
default:
break;
} itemList.Add(temp);
}
}
按照以上思路,先以Item类型来反序列化,然后根据Item.Type来判断物品类的具体子类型,如果为Consumable消耗品类型,就获取该类型的HP和MP属性,再按消耗品类型来实例化对象。
但是由于反序列化时指定为Item类型,所以即便Json字符串中包含了HP和MP的内容,也不会被解析到Item对象身上。

所以问题是:解析为父类时,再想根据父类中的属性来转型为子类,会导致转型失败!
JSONObject怎么用
现在改用JSONObject,可以解决该问题。
首先在AssetStore中下载JSONObject并导入到Unity项目中。

根据它的ReadMe以及里面自带的Demo,可以快速学习使用该插件。代码修改为如下:
private List<Item> itemList = new List<Item>();
/// <summary>
/// 解析物品Json
/// </summary>
public void ParseItemJson(string itemsJson)
{
JSONObject j = new JSONObject(itemsJson);
foreach (JSONObject temp in j.list)
{
int id = (int)temp["id"].n;
string name = temp["name"].str;
Item.ItemType type = (Item.ItemType)System.Enum.Parse(typeof(Item.ItemType), temp["type"].str);
Item item = null;
switch (type)
{
case Item.ItemType.Consumable:
int hp = (int)temp["hp"].n;
int mp = (int)temp["mp"].n;
item = new Consumable(id, name, type, hp, mp);
break;
// 其他类型省略
default:
break;
}
Debug.Log("item.id = " + item.ID + " , consumable.hp = " + ((Consumable)item).HP);
itemList.Add(item);
}
}
运行后可以正确解析Json,拿到父类和子类的属性值。

学习资料:
【Unity】使用JSONObject解析Json的更多相关文章
- JSONObject解析json数据
首先先看一下我们要解析的json数据是什么样子的: 代码: String url="http://113.57.190.228:8001/Web/Report/GetBigMSKReport ...
- 浅谈JSONObject解析JSON数据
我们在做jmeter接口测试时能会用beanshell断言,一般都会将返回值转成JSONObject对象进行处理.本文选取较为复杂json格式数据,也将适用于java接口测试. JSON数据 { &q ...
- 使用JsonObject解析json
第一种: [ { "0": "1", "1": "一", "id": "1", ...
- Android使用自带JSONObject解析JSON数据
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android ...
- 解析JSON有俩种方式:JSONObject和GSON
JSONObject: //JSONObject解析JSON文件 private void parseJSONWithJSONObject(String json_data) { try { JSON ...
- json解析json字符串时候,数组必须对应jsonObjectArray,不能对应JsonObject。否则会解析错误。
json第三方解析json字符串时候,json数组必须对应jsonObjectArray,不能对应JsonObject.->只要是[]开头的都是json数组字符串,就要用jsonArray解析 ...
- 使用JSONObject生成和解析json
1. json数据类型 类型 描述 Number 数字型 String 字符串型 Boolean 布尔型 Array 数组,以"[]"括起来 Object 对象,类似于C中的结构体 ...
- unity解析json的两种方式
一直比较钟情于json,用来做数据交互,堪称完美!下面简单说一下unity使用C#脚本如何解析json数据吧. 一.写解析类,借助于JsonUtility.FromJson 直接给个例子吧 1.jso ...
- JSON初体验(一):JsonObject解析
在学校的呆了一段时间,马上又要回去工作了,不说了,我现在介绍一下json相关的内容 1.JSON数据格式(总的来说,json就是一个字符串) 1.整体结构 String json1 = "{ ...
随机推荐
- 企业内知识库wiki所存在的问题
相信很多公司都利用开源的wiki web app搭建了自家的内部wiki服务,比如使用media Wiki, Gollum, doku wiki, jsWiki等 但是,真正可用的企业wiki系统却没 ...
- 如何将shell的打印日志输入到日志文件
如果shell打印的日志很多,屏幕无法完全显示,需要查看shell执行的情况,这是就需要输入到日值了: 如:echo "2012-6-14" | tee -a my.log -a表 ...
- echarts 与 百度地图bmap结合系列: 如何设置地图缩放级别和监听缩放事件
简单的demo: // ehcarts 的实例对象 this.myChart = echarts.init(el) // ehcarts加载完成事件 this.myChart.on('finished ...
- Web安全之XSS(Cross Site Scripting)深入理解
XSS的含义 XSS(Cross Site Scripting)即跨站脚本.跨站的主要内容是在脚本上. 跨站脚本 跨站脚本的跨,体现了浏览器的特性,可以跨域.所以也就给远程代码或者第三方域上的代码提供 ...
- 微信小程序 weui 使用方法
https://github.com/Tencent/weui-wxss/ 下载地址用于小程序的https://github.com/Tencent/weui 下载地址用于H5 运用示例 ...
- Ubuntu中开启和关闭防火墙-摘自网络
1.关闭ubuntu的防火墙 ufw disable开启防火墙ufw enable 2.卸载了iptablesapt-get remove iptables3.关闭ubuntu中的防火墙的其余命令ip ...
- grafana 的面板设置
1.工作中我们会计算连个字段的四则运算
- php的opcode缓存
前言:由php的运行机制决定,其实php在运行阶段我们也是可以进行缓存的从而提高程序运行效率,这就是我们常说的opcode缓存.1.简述php的运行机制(因为本文是写opcode缓存的所以这里只是简要 ...
- Android呼叫管理服务之会话发起协议(SIP)API
原文:http://android.eoe.cn/topic/android_sdk Android提供了一个支持会话发起协议(SIP)的API,这可以让你添加基于SIP的网络电话功能到你的应用程序. ...
- Android app 全局异常统一处理
异常处理需求 Android app 出现 crash 时,会出现 "程序异常退出" 的提示并关闭,体验不好,另外主要是无法知道哪里出现的崩溃,需要知道哪里造成的异常,就需要一个全 ...