【问题标题】:Deserializing a JSON string into an object in C# and Unity在 C# 和 Unity 中将 JSON 字符串反序列化为对象
【发布时间】:2020-03-25 11:54:05
【问题描述】:

我从 API 接收 JSON 字符串,我需要将其反序列化为可以在 C# 和 Unity 中使用的内容。我正在尝试使用Unity's JSON Serialization,但它似乎对我不起作用?

以下是 API 中 JSON 结构的示例:

{
    "results": [
        [
            "2016-09-01/20160901_200002_000.jpg",
            "2016-09-01/20160901_192851_000.jpg",
            "2016-09-01/20160901_193443_000.jpg",
            "2016-09-01/20160901_210130_000.jpg"
        ],
        [
            "2016-09-02/20160902_104409_000.jpg",
            "2016-09-01/20160901_165949_000.jpg"
        ],
        [
            "2016-09-02/20160902_104409_000.jpg",
            "2016-09-02/20160902_104721_000.jpg",
            "2016-09-02/20160902_093420_000.jpg",
        ],
        [
            "2016-09-02/20160902_082554_000.jpg"
        ]
    ]
}

这是我尝试使用 Unity 的 JsonUtility 类将 JSON 反序列化为自定义类的代码:

[Serializable]
public class MyClass
{
    public List<List<string>> results;
}

MyClass test = JsonUtility.FromJson<MyClass>(jsonString);
Debug.Log(test.results); // this is just returning null 

有人知道我做错了什么吗?

编辑:This 答案似乎表明这是因为 JsonUtility 不支持数组并提供了一个帮助类,但它不适用于这个问题。

【问题讨论】:

  • 仅供参考,您正在尝试反序列化 JSON
  • 我作为欺骗目标链接的问题有你的答案,虽然它是一个很长的阅读。我认为您可能会遇到问题“如果您得到 Null,请确保 Json 不是 Json 数组。如果是,请使用上面的帮助程序类和 JsonHelper.FromJson 而不是 JsonUtility.FromJson。”
  • @IanKemp 这是对该问题的一个非常有用的答案,但是它对我的问题所做的只是提出了问题发生的原因,即“Unity 的 JsonUtility 不支持数组,因为它仍然是新的”。不幸的是,提供的帮助程序类不适用于我的问题,可能是因为我认为我的 JSON 的数组中有一个数组,所以有一层额外的复杂性?无论哪种方式,我都不会就如何编辑帮助程序类提出新问题,所以这个问题仍然没有答案。

标签: c# json unity3d


【解决方案1】:

这是我用来解码 JSON 的方法:

  1. 管理您的 NuGet 并将 Json.NET.Web 添加到您的引用中
  2. 复制粘贴如下方法
  3. 确保您获得了正确的对象。看起来您有一个键 (="results"),接下来是与您的键对应的值。 您可以对“结果”进行八重解码,首先删除所有括号“[]”,然后将字符串拆分为 char[','] 或使用每个值的键形成 JSON(如果可能)并解码这些值。李>

希望对您有所帮助

public Dictionary<string, string> Decode(string encodedJson, string[] keys)
    {
        var details = JObject.Parse(encodedJson);
        Dictionary<string, string> decodedjson = new Dictionary<string, string>();
        foreach (var key in keys)
        {
            decodedjson.Add(key, details[key].ToString());
        }

        return decodedjson;
    }

【讨论】:

  • 因为这比尝试破解 Unity 的 JsonUtility 类要容易得多,我认为这对于我的回答是必要的,我将其标记为正确的解决方案。
  • 请不要这样做@AzzyDude。这个“JSON.NET.Web”包最后一次更新是在 2016 年,没有描述,链接到一个不存在的 GitHub 存储库,而且基本上看起来很狡猾。如果您要使用第三方 JSON 序列化/反序列化包,请使用事实上的标准 Newtonsoft.Json。
  • @IanKemp 如果您想使用 Newtonsoft.Json 提交类似风格的答案,我很乐意将其设置为解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-27
  • 2019-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
相关资源
最近更新 更多