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的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Python 字典序列化为字符串,然后再返回字典?

从 JSON 反序列化重复字典

添加嵌套字典会导致 JSONSerialization 返回 nil

如何将对象的json数组反序列化为字典[重复]

Newtonsoft Json 将字典反序列化为来自 DataContractJsonSerializer 的键/值列表

将json键值反序列化为字典c#