繁体   English   中英

访问子对象时序列化 JSON 文件返回空对象

[英]Serializing a JSON file returns null object when acccessing child objects

我正在尝试读取包含各种对象的本地 JSON 文件。 但是对象总是返回null。

我知道Resources.Load<TextAsset>(_directory + _fileName).text; 已成功找到该文件,因为我可以将文本输出到控制台。

在此处输入图片说明

我的目标是能够请求密钥并取回所选语言的值。 即: hello_world.sp将返回Hola, mundo

但是,无论何时我去访问任何对象,如Debug.Log(lang.languageList.Count); 我收到错误:

NullReferenceException:未将对象引用设置为对象的实例

最终,我希望能够添加额外的语言值, frit等......

谁能看到我做错了什么?

语言文件

{
  "hello_world": {
    "en": "Hello, World!",
    "sp": "Hola, mundo"
  },
  "button_ok": {
    "en": "Yes",
    "sp": "Si"
  },
  "button_cancel": {
    "en": "Cancel",
    "sp": "Cancelar"
  }
}

JSONLoad.cs

public class JSONLoader
{
    private static readonly string _directory = "Langs/";
    private static readonly string _fileName  = "lang";

    private string ReadJsonFile() { return Resources.Load<TextAsset>(_directory + _fileName).text; }

    public void Load()
    {
        var file = ReadJsonFile();
        var lang = JsonUtility.FromJson<LanguageObject>(file);

        Debug.Log(lang);
    }
}

    [Serializable]
    public class LangValue
    {
        public string en { get; set; }
        public string sp { get; set; }
    }

    [Serializable]
    public class LangKey
    {
        public string          id       { get; set; }
        public List<LangValue> children { get; set; }
    }

    [Serializable]
    public class LanguageObject
    {
        public List<LangKey> languageList { set; get; }
    }

根据文档,使用UnityEngine.JsonUtility JSON 序列化依赖于具有公共字段而不是属性的模型 您需要使用字段而不是属性来定义模型。

IE。,

[Serializable]
public class LangValue
{
    public string en;
    public string sp;
}

[Serializable]
public class LangKey
{
    public string id;
    public List<LangValue> children;
}

[Serializable]
public class LanguageObject
{
    public List<LangKey> languageList;
}

您的 Json 结构与您的课程不匹配。 这不是一个列表。 这是一个工作示例:

杰森:

{
    "languageList": 
     [
        {
            "id": "hello_world",
            "children": {
                "en": "Hello, World!",
                "sp": "Hola, mundo"
            }
        },
        {
            "id": "button_ok",
             "children": {
                "en": "Yes",
                "sp": "Si"
            }
        },
        {
            "id": "button_cancel",
            "children": {
                "en": "Cancel",
                "sp": "Cancelar"
            }
        }
    ]
}

课程:

[Serializable]
public class LangValue
{
    public string en;
    public string sp;
}

[Serializable]
public class LangKey
{
    public string id;
    public LangValue children;
}

[Serializable]
public class LanguageObject
{
    public List<LangKey> languageList;
}

PS:我不是JsonUtility的粉丝,我宁愿选择Json.Net ,它允许使用属性等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM