c# - Unity 将嵌套字典序列化为 JSON

标签 c# json unity3d serialization archer

我正在使用的 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 和实例化:

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 是使用 json 的最快方式,因为它几乎不会生成任何 GC。问题是它不是很灵活,因为您需要提前知道数据结构,并且它不能因为需要一个类而改变。

如果你需要使用 Jsons 作为字典,你可以使用 MiniJSON (只需点击并另存为...)或JSONObject ,两者都是免费的并且可以在每个平台上工作,尽管它们比 JsonUtilty 慢很多,所以如果你正在解析大的 json 或者需要在性能很重要的情况下做很多次那么它就不会流畅。

我个人都用过,它们都很棒,MiniJSON 更容易使用,而 JSONObject 更强大但也更难上手。

编辑:

如评论之一所述,您还可以使用 Newtonsoft ,我认为它比 minijson 和 jsonobject 更快,但如果你没有用 jsons 做很多事情,可能会有点矫枉过正。

关于c# - Unity 将嵌套字典序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42103603/

相关文章:

json - Swift 4 中的配置错误

php - PHP 的 json_parse 的内存耗尽错误

c# - 动态实例化 5 个表的 5 个计时器(UNITY 3D)

unity3d - unity Rigidbody2d 不与其他 Rigidbody2ds 交互

c# - 在 View 中显示模型状态错误?

c# - Selenium Chrome 驱动程序(75 及以上)使用 GetLog() 方法访问日志时出现问题

c# - 如何添加对 Microsoft.VisualBasic.dll 的引用?

asp.net - 从异步调用加载 ASP.NET GridView

facebook-graph-api - Facebook Unity3d SDK 不包含 FBUtil 和 GameStateManager 类

c# - 如何在 C# 库中使用嵌入式 .NET exe,而不从其 byte[] 重建文件?