簡體   English   中英

Unity將嵌套字典序列化為JSON

[英]Unity Serializing Nested Dictionary to JSON

我正在使用的REST服務RSA Archer期望一個整數鍵,這意味着我根本無法嵌套[Serializable]對象,然后JsonUtility.ToJson()來創建序列化的JSON字符串。 我以為我找到了一個創建Dictionary對象的解決方案,然后使用ISerializationCallbackReceiver來處理嵌套結構的字典片段,但下面的代碼只是忽略了嵌套對象的那部分而沒有序列化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));

JsonUtility是使用jsons的最快方式,因為它幾乎不會生成任何GC。 問題是它不是很靈活,因為你需要提前知道數據結構,因為它需要一個類而不能變異。

如果你需要使用Jsons作為詞典,你可以使用MiniJSON (恰好正確的clic和另存為...)或JSONObject ,兩者都是免費的,並且可以在每個平台上工作,盡管它們比JsonUtilty慢很多,所以如果你要解析大的jsons或需要做很多次,而性能很重要,那么它不會是流動的。

我個人已經使用了它們並且它們很棒,MiniJSON使用起來有點容易,而JSONObject更有效但開始時也有點困難。

編輯:

正如其中一條評論中所提到的,你也可以使用Newtonsoft ,我認為它比minijson和jsonobject更快,但如果你沒有用jsons做很多東西可能會有點過分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM