Unity将嵌套字典序列化为JSON

时间:2017-02-08 02:24:34

标签: c# json unity3d serialization archer

我正在使用的REST服务RSA Archer期望一个整数键,这意味着我不能嵌套[Serializable]个对象,然后JsonUtility.ToJson()来创建序列化的JSON字符串。我以为我找到了一个创建Dictionary对象的解决方案,然后使用ISerializationCallbackReceiver来处理嵌套结构的字典片段,但下面的代码只是忽略了嵌套对象的那部分而且没有#39} ; t序列化Dictionary。有没有人对最佳方法有任何想法?

预期产出:

{"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和Instantiation:

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));

1 个答案:

答案 0 :(得分:0)

JsonUtility是使用jsons的最快方式,因为它几乎不会生成任何GC。问题是它不是很灵活,因为你需要提前知道数据结构,并且它不能因为它需要一个类而变异。

如果您需要使用Jsons作为词典,您可以使用MiniJSON(恰好正确的clic和另存为...)或JSONObject,两者都是免费的,并且可以在每个平台上工作,尽管它们是比JsonUtilty慢很多,所以如果你要解析大jsons或者需要多次执行它,而性能很重要,那么它就不会流畅。

我个人已经使用了两者并且它们很棒,MiniJSON使用起来有点容易,而JSONObject更有效但开始时也有点困难。

编辑:

正如其中一条评论所提到的,你也可以使用Newtonsoft,我认为它比minijson和jsonobject更快,但如果你没有用jsons做很多事情,可能会有点过分。