Сериализация файла JSON возвращает нулевой объект при доступе к дочерним объектам - PullRequest
2 голосов
/ 04 марта 2020

Я пытаюсь прочитать в локальном JSON файле, который содержит различные объекты. Но объект всегда возвращает ноль.

Я знаю, что Resources.Load<TextAsset>(_directory + _fileName).text; успешно нашел файл, поскольку я могу вывести текст на консоль.

enter image description here

Моя цель - иметь возможность запросить ключ и вернуть значение для выбранного языка. ie: hello_world.sp вернет Hola, mundo.

Однако, когда я go получаю доступ к любому объекту, например Debug.Log(lang.languageList.Count);, я получаю ошибку:

NullReferenceException: Ссылка на объект не установлена ​​для экземпляра объекта

В конце концов, я хотел бы иметь возможность добавлять дополнительные языковые значения, fr, it, et c ...

Кто-нибудь может увидеть, что я делаю неправильно?

lang. json

{
  "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; }
    }

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Ваша Json структура не соответствует вашим классам. Это не список. Вот рабочий пример:

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 Я бы скорее go для Json.Net, что позволяет использовать свойства среди прочего.

1 голос
/ 04 марта 2020

Согласно сериализация документов , JSON с использованием UnityEngine.JsonUtility основана на моделях, имеющих c поля , а не свойства . Вам нужно определить свои модели с полями вместо свойств.

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...