Unity 将嵌套字典序列化为 JSON
Posted
技术标签:
【中文标题】Unity 将嵌套字典序列化为 JSON【英文标题】:Unity Serializing Nested Dictionary to JSON 【发布时间】:2017-02-08 02:24:34 【问题描述】:我正在使用的 REST 服务 RSA Archer 需要一个整数键,这意味着我根本无法嵌套 [Serializable]
对象和 JsonUtility.ToJson()
来创建序列化的 JSON 字符串。我想我找到了一个解决方案来创建一个Dictionary
对象,然后使用ISerializationCallbackReceiver
来处理嵌套结构的字典部分,但是下面的代码只是忽略了嵌套对象的那一部分并且不序列化@987654325 @。有没有人对最好的方法有任何想法?
预期输出:
"Content": "LevelId": 10,"FieldContents": "47": "Type": 1, "Value": "me", "FieldId": 47
对象结构:
[Serializable]
public class Record
public Content Content;
[Serializable]
public class Content
public int LevelId;
public FieldContents FieldContents;
public class FieldContents : ISerializationCallbackReceiver
public Dictionary<string, FieldValue> FieldValues;
public List<string> dicKeys;
public List<FieldValue> dicVals;
public void OnBeforeSerialize ()
dicKeys.Clear ();
dicVals.Clear ();
foreach (var kvp in FieldValues)
dicKeys.Add (kvp.Key);
dicVals.Add (kvp.Value);
public void OnAfterDeserialize ()
FieldValues = new Dictionary<string, FieldValue> ();
for (int i = 0; i < Math.Min (dicKeys.Count, dicVals.Count); i++)
FieldValues.Add (dicKeys [i], dicVals [i]);
[Serializable]
public class FieldValue
public int Type;
public string Value;
public int FieldId;
JSONUtility 和实例化:
Record newRecord = new Record () Content = new Content ()
LevelId = 10,
FieldContents = new FieldContents () FieldValues = new Dictionary<string, FieldValue> ()
"47",
new FieldValue ()
Type = 1,
Value = "me",
FieldId = 47
;
Debug.Log (JsonUtility.ToJson (newRecord));
【问题讨论】:
Unity 的JsonUtility
不支持字典。
@Programmer 这就是我尝试使用ISerializationCallbackReceiver
的原因。其他数据结构在这里更合适吗?
对不起。这点实在是帮不上忙。您可能应该使用支持 Dictionary 的付费 Json 插件。这是我对你的建议。
我正在使用 newtonsoft。免费而且很棒。将其导入统一有点麻烦
【参考方案1】:
JsonUtility 是使用 json 的最快方式,因为它几乎不会产生任何 GC。问题是它不是很灵活,因为你需要提前知道数据结构并且它不能被改变,因为它需要一个类。
如果您需要将 Jsons 用作字典,您可以使用 MiniJSON(恰到好处 clic 并另存为...)或 JSONObject,两者都是免费的,并且可以在每个平台上工作,尽管它们比 JsonUtilty 慢很多,因此,如果您正在解析大型 json,或者需要在性能很重要的情况下多次解析,那么它就不会是流畅的。
我个人都使用过,它们都很棒,MiniJSON 更容易使用,而 JSONObject 更强大但也更难开始。
编辑:
正如其中一个 cmets 中提到的,您也可以使用 Newtonsoft,我认为它比 minijson 和 jsonobject 更快,但如果您不使用 jsons 做很多事情,可能会有点矫枉过正。
【讨论】:
谢谢@Juan。我当然不反对 3rd 方库,但是当我使用 LitJSON 执行此操作时,我遇到了许多问题,使其与 Hololens 一起工作,因此回退到 JsonUtility。我将测试那些其他库,看看它们是怎么做的。 如果你不需要解析大的json,我推荐你minijson,它只是一个脚本,而且超级好用。 Google 和 Facebook 正在他们的 sdks 中使用它来实现统一以上是关于Unity 将嵌套字典序列化为 JSON的主要内容,如果未能解决你的问题,请参考以下文章
添加嵌套字典会导致 JSONSerialization 返回 nil
Newtonsoft Json 将字典反序列化为来自 DataContractJsonSerializer 的键/值列表