【问题标题】:Trying to parse a JSON array in Unity C# but it returns null尝试在 Unity C# 中解析 JSON 数组,但它返回 null
【发布时间】:2019-03-06 07:08:38
【问题描述】:

这是我的 JSON 文件:

[
  {
    "name": "An item"
  }
 ]

这是我的助手类:

public static class JsonHelper
    {
        public static T[] FromJson<T>(string json)
        {
            string newJson = "{ \"array\": " + json + "}";
            Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(newJson);
            return wrapper.array;
        }

        [System.Serializable]
        private class Wrapper<T>
        {
            public T[] array;
        }
    }

这是我试图制作对象的类:

public class Item
{   
    public string name, desc;
}

这是我调用助手类的地方:

Item[] itemList = JsonHelper.FromJson<Item>(itemJson.text);

问题是itemListwrapper.array 中的JsonHelpernull

我直接从以下地址复制代码:

http://www.boxheadproductions.com.au/deserializing-top-level-arrays-in-json-with-unity/

https://forum.unity.com/threads/how-to-load-an-array-with-jsonutility.375735/

我做错了什么?

【问题讨论】:

  • Unity 的 JSON 实现不支持展开的顶级数组。无论如何,您都不想养成使用它们的习惯,考虑到顶级 JSON 数组多年来一直是多个安全漏洞的目标。

标签: c# json unity3d jsonparser


【解决方案1】:

我建议您在包管理器控制台中使用以下命令为 Unity 安装 json.net NuGet 包

Install-Package Unity.Newtonsoft.Json -Version 7.0.0

然后无需修改大部分代码,您就可以让它工作

只需将您的 JsonHelper 类替换为以下

public static class JsonHelper
{
    public static T[] FromJson<T>(string json)
    {
        string newJson = "{ \"array\": " + json + "}";
        JToken jToken = JToken.Parse(newJson);
        Wrapper<T> wrapper = jToken.ToObject<Wrapper<T>>();
        return wrapper.array;
    }

    [System.Serializable]
    private class Wrapper<T>
    {
        public T[] array;
    }
}

您需要将using Newtonsoft.Json.Linq; 命名空间添加到您的程序中。

输出:(来自调试器)

警告:使用 Newtonsoft.Json 不适用于 WebGL 项目。

【讨论】:

  • 谢谢,它有效。但是在我的代码中使用 Unity 的官方 JSON 库有什么问题呢?
  • 我在您的问题中看到您的代码没有任何问题,但是统一 Json 库有点缺乏,这从它无法支持顶级数组就可以看出。
  • @HenryZhang,我认为 Lasse Vågsæther Karlsen 的上述评论是正确的,因为您的 json 是顶级数组。如果我的回答对您有帮助,请在答案左侧标记勾号,使其变为绿色并投票:)
  • 内置 json 实用程序也不能做其他事情,例如自定义转换器,因此您可以以非标准方式序列化事物。例如,在 Minecraft 中,我想将世界保存为块。我不想在每个位置对整个 Block 类进行编码!我只想编码一个可以在反序列化期间查找的 reference 。比如"block_stone"1
  • 请注意 - 使用 Newtonsoft.Json 不适用于 WebGL 项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多