为何要用JSONObject

之前已经用过JsonUtility和Newton.Json来解析Json了,为什么现在又要用一个新的JSONObject来解析Json?

在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的更多相关文章

  1. JSONObject解析json数据

    首先先看一下我们要解析的json数据是什么样子的: 代码: String url="http://113.57.190.228:8001/Web/Report/GetBigMSKReport ...

  2. 浅谈JSONObject解析JSON数据

    我们在做jmeter接口测试时能会用beanshell断言,一般都会将返回值转成JSONObject对象进行处理.本文选取较为复杂json格式数据,也将适用于java接口测试. JSON数据 { &q ...

  3. 使用JsonObject解析json

    第一种: [ { "0": "1", "1": "一", "id": "1", ...

  4. Android使用自带JSONObject解析JSON数据

    import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import android ...

  5. 解析JSON有俩种方式:JSONObject和GSON

    JSONObject: //JSONObject解析JSON文件 private void parseJSONWithJSONObject(String json_data) { try { JSON ...

  6. json解析json字符串时候,数组必须对应jsonObjectArray,不能对应JsonObject。否则会解析错误。

    json第三方解析json字符串时候,json数组必须对应jsonObjectArray,不能对应JsonObject.->只要是[]开头的都是json数组字符串,就要用jsonArray解析 ...

  7. 使用JSONObject生成和解析json

    1. json数据类型 类型 描述 Number 数字型 String 字符串型 Boolean 布尔型 Array 数组,以"[]"括起来 Object 对象,类似于C中的结构体 ...

  8. unity解析json的两种方式

    一直比较钟情于json,用来做数据交互,堪称完美!下面简单说一下unity使用C#脚本如何解析json数据吧. 一.写解析类,借助于JsonUtility.FromJson 直接给个例子吧 1.jso ...

  9. JSON初体验(一):JsonObject解析

    在学校的呆了一段时间,马上又要回去工作了,不说了,我现在介绍一下json相关的内容 1.JSON数据格式(总的来说,json就是一个字符串) 1.整体结构 String json1 = "{ ...

随机推荐

  1. Android基础之——CountDownTimer类,轻松实现倒计时功能

    在发现这个类之前,一直是用的handler,子线程发消息,UI线程进行倒计时的显示工作.前几天在做一个倒计时显示的时候发现了这个类,用起来非常方便 翻看了下源代码.内部已经帮我们实现了handler的 ...

  2. Windows键盘消息处理

    原文链接: http://blog.sina.com.cn/s/blog_5f8817250100taab.html 本文大部分来自MSDN和网友的博客,我在实践的基础上再作了一些总结. 1,虚拟键( ...

  3. 64位FreeSWITCH编译安装(版本1.4.20)

    1.安装64位的CentOS6.5操作系统(勾选的服务器版本安装). 2.下载FreeSWITCH安装包以及关联的lib库.下载地址http://files.freeswitch.org/downlo ...

  4. 手动脱WinUpack 壳实战

    作者:Fly2015 吾爱破解培训第一课选修作业第6个练习演示样例程序.不得不反复那句话,没见过这样的壳,该壳是压缩壳的一种,相对于压缩壳,加密壳的难度要大一些.特别是IAT表的修复问题上. 首先分别 ...

  5. 【转】java原理—反射机制

    一.什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序语言 ...

  6. 【转载,待整理】初学 springmvc整合shiro

    1. shiro认证流程理解 2. 整合过程 http://blog.csdn.net/dawangxiong123/article/details/53020424 http://blog.csdn ...

  7. [转]What are mode and status columns under gp_segment_configuration table

    February 16, 2017 10:39 Goal In this article we will try to understand and answer to the below two q ...

  8. django form 对象is_bound属性

    问题: 如果判断一个form实例中有没有数据? bug方法: 通过form实例的is_valid()方法来验证 1.Form类的定义 class YourName(Form): your_name = ...

  9. 定时删除elasticsearch的index

    #!/bin/bashfind /data/elasticsearch/data/kz-log/nodes/0/indices/ -type d -mtime +5 |  awk -F"/& ...

  10. js省市级联实现

    js省市级联实现. for [element] in [collection] 用于循环下标,常用于json for(index in arr){ console.info("下标:&quo ...