我有一个使用 [WWW( https://docs.unity3d.com/ScriptReference/WWW.html )从服务器端发送的元素列表(例如,从 PHP 发送)。其内容 (WWW.text) 如下所示:
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
我正在使用的课程如下所示:
public class player {
public string playerId { get; set; }
public string playerLoc { get; set; }
public string playerNick { get; set; }
}
尝试以不同方式反序列化字符串:
- 使用
Boomlagoon.JSON
过,但由于某种原因它只检索第一个对象。 我尝试使用
MiniJSON
:切断[]
发送的字符串然后应用库:IDictionary<string,object> s = Json.Deserialize(serviceData) as IDictionary<string,object>; foreach (KeyValuePair<string, object> kvp in s) { Debug.Log(string.Format("Key = {0}, Value = {1}", kvp.Key, kvp.Value)); }
但它返回 `KeyValuePair 的第一个值:
Key = playerId, Value = 1 Key = playerLoc, Value = Powai
如果你离开括号,那么根本无法解析 json,因此
foreach
抛出错误是合乎逻辑的:NullReferenceException:对象引用未设置到对象的实例
如何正确序列化和反序列化来自 json 的数据?使用什么以及如何使用?
从5.3.3版本开始, Unity在其 API中添加了JsonUtility 。你可以忘记各种第三方库,除非你正在做一些非常复杂的事情。
JsonUtility比这些第三方库更快,但同时仅支持简单类型。它不支持字典等集合。例外是列表(List)。它支持列表(List)和列表数组(List array)。
如果您需要序列化 Dictionary 或做一些简单类型的简单序列化和反序列化以外的事情,请使用第三方库。否则,升级到版本 >= 5.3.3并尝试以下解决方案。
序列化示例类:
1. 一个对象(不是 JSON 数组)
初始数据:
序列化 1:
使用public static string ToJson(object obj) 序列化为 json;.
输出:
连载 2:
使用重载方法序列化为json public static string ToJson(object obj, bool prettyPrint); . 添加一个标志作为
true
函数的第二个参数JsonUtility.ToJson
将格式化数据。将下面的输出与上面的输出进行比较。输出:
反序列化 1:
使用public static T FromJson(string json) 反序列化 json;.
反序列化 2:
使用重载方法public static object FromJson(string json, Type type)反序列化json;.
反序列化 3:
使用public static void FromJsonOverwrite(string json, object objectToOverwrite) 反序列化 json;.
使用该方法时
JsonUtility.FromJsonOverwrite
,不会创建该对象的新实例,但您作为参数传递给该函数的对象将被重用,覆盖它的值。2. 大量数据(json 数组):您的 json 包含多个带有数据的对象。
JsonUtility本身还不支持数组,但您可以使用一个小的帮助程序类来获取可与JsonUtility一起使用的数组。
我们创建一个类
JsonHelper
。您可以复制以下帮助代码:序列化 json 数组:
输出:
反序列化 json 数组:
输出:
注意:如果这个json数组是从服务器端来的,而你又不是自己手动创建的,那么你需要把它添加
{"Items":
到接收到的字符串的开头和}
这个字符串的结尾。这是一个简单的函数:
然后使用它:
3. 修复 JsonUtility 问题:
使用 JsonUtility.ToJson 时遇到序列化问题?您得到的是空字符串还是“
{}
”?JsonHelper.ToJson
代替JsonUtility.ToJson
.[Serializable]
要序列化的类的声明上方添加一个属性。public string playerId { get; set; }
删除{ get; set; }
。Unity将无法序列化它们。使用时出现反序列化问题
JsonUtility.FromJson
?Null
,请确保 json 不是 json 数组。如果是这样,则使用上面的帮助器类及其方法JsonHelper.FromJson
代替JsonUtility.FromJson
.NullReferenceException
在反序列化过程中获取到它,则将属性添加[Serializable]
到类声明上方。在回答你的问题时:
您的初始数据:
追加
{"Items":
到此行的开头并追加}
到此行的末尾。代码如下所示:
现在你有一行:
现在要将来自 php 的大量数据序列化为数组,您可以这样做:
playerInstance[0]
- 来自第一个对象的数据playerInstance[1]
- 来自第二个对象的数据playerInstance[2]
- 来自第三个对象的数据注意: 从类中删除 。如果你有,那么它将不起作用。JsonUtility不适用于声明为属性的类成员。
{ get; set; }
player
{ get; set; }
如果需要它们,那么您将不得不使用其他库或 XmlSerializer / BinaryFormatter
答案翻译https://stackoverflow.com/a/36244111/6104996
如果您对空对象有疑问,还要检查 Items 是否与代码中的所需值匹配
例如,我来自服务器的 JSON 是这样的:{"data":[{"id":"...
因此,我们将项目更改为数据。