Попытка разобрать массив JSON в Unity C #, но он возвращает ноль - PullRequest
0 голосов
/ 06 марта 2019

Вот мой файл 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);

Проблема в itemList, а wrapper.array в JsonHelper равно null.

Iскопировал код прямо с:

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/

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Я предлагаю вам установить json.net пакет NuGet для Unity, используя приведенную ниже команду в консоли диспетчера пакетов

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; пространство имен в вашу программу.

Вывод: (из отладчика)

enter image description here

Внимание: при использовании Newtonsoft.Json не работает в проектах WebGL.

0 голосов
/ 06 марта 2019

Вы можете увидеть мой ответ (Финальная часть редактирования) здесь Преобразование массивов массивов в json

, чтобы понять, как использовать библиотеку json unity по умолчанию.

IЯ не уверен, что не так с вашей реализацией прямо сейчас, но есть несколько вещей, которые вы должны помнить при использовании реализации Unity: - Ваши переменные в структуре классов должны использовать то же имя вашего Json (или вам нужно указатьаннотация).- Все ваши классы нуждаются в System.Serializable, и вам нужно создать структуру json с базовым массивом / списком (вы можете использовать несколько классов для сложного типа).- Ваши переменные нуждаются в getter / setter

Я думаю, что основными проблемами являются имя, которое вы используете для переменных вашего класса, и что вы должны реализовать getter / setter, и вам необходимо использовать System.Serializable также в классе Item,но сейчас я не могу все проверить.

PS.Это хороший документ для понимания правил сериализации единиц: https://docs.unity3d.com/Manual/script-Serialization.html

(помните, что сериализация по умолчанию хороша для производительности).

...