【问题标题】:Unity Serializing Nested Dictionary to JSONUnity 将嵌套字典序列化为 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。免费而且很棒。将其导入统一有点麻烦

标签: c# json unity3d serialization archer


【解决方案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 中使用它来实现统一
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-03
相关资源
最近更新 更多