Сериализация JSON
Используйте класс JsonUtility для преобразования объектов Unity в JSON формат. Например, сериализацию JSON можно использовать для взаимодействия с веб-службами или для простой упаковки и распаковки данных в текстовый формат.
Сериализация JSON использует понятие «структурированного» JSON: вы создаете класс или структуру для описания того, какие переменные вы хотите хранить в своих данных JSON. Например:
[Serializable] public class MyClass
Это определяет простой класс C#, содержащий три переменные (level, timeElapsed и playerName), и помечает его Serializable для работы с сериализатором JSON. Чтобы создать экземпляр вашего класса, вы можете использовать что-то вроде этого:
MyClass myObject = new MyClass(); myObject.level = 1; myObject.timeElapsed = 47.5f; myObject.playerName = «Dr Charles Francis»;
Затем используйте метод JsonUtility.ToJson, чтобы сериализовать его (преобразовать) в формат JSON:
Чтобы преобразовать JSON обратно в объект, используйте JsonUtility.FromJson:
myObject = JsonUtility.FromJson (json);
Это создает новый экземпляр MyClass и задает для него значения с использованием данных JSON. Если данные JSON содержат значения, не соответствующие полям в MyClass , сериализатор игнорирует эти значения. Если в данных JSON отсутствуют значения для полей в MyClass , сериализатор оставляет созданные значения для этих полей в возвращаемом объекте.
Перезапись объектов с помощью JSON
Вы также можете десериализовать данные JSON поверх существующего объекта, что перезапишет любые существующие данные:
Если данные JSON не содержат значения для поля, сериализатор не изменяет значение этого поля. Этот метод позволяет свести выделение к минимуму за счет повторного использования ранее созданных объектов. Он также позволяет вам «исправлять» объекты, преднамеренно перезаписывая их с помощью JSON, который содержит только небольшое подмножество полей.
Предупреждение. JSON Serializer API поддерживает MonoBehaviour и ScriptableObject. подклассы, а также простые структуры и классы. Однако при десериализации JSON в подклассы MonoBehaviour или ScriptableObject необходимо использовать FromJsonOverwrite. Если вы попытаетесь использовать FromJson, Unity выдаст исключение, поскольку такое поведение не поддерживается.
Поддерживаемые типы
JSON Serializer API поддерживает любой подкласс MonoBehaviour , подкласс ScriptableObject , а также простой класс или структуру с [Serializable] . Когда вы передаете объект стандартному сериализатору Unity для обработки, применяются те же правила и ограничения, что и в Инспекторе: Unity сериализует только поля; и такие типы, как Dictionary<> , не поддерживаются.
Unity не поддерживает передачу других типов напрямую в API, таких как примитивные типы или массивы. Если вам нужно преобразовать их, оберните их в какой-нибудь класс или struct .
Только в редакторе есть параллельный API, EditorJsonUtility, который позволяет сериализовать любой объект, производный от UnityEngine.Object как в JSON, так и из него. Это создает JSON, который содержит те же данные, что и YAML-представление объекта.
JsonUtility и EditorJsonUtility — это служебные классы для сериализации объектов в JSON и обратно. строковый формат с использованием правил сериализации Unity. В тех случаях, когда необходимо манипулировать данными JSON с помощью кода или сериализовать структуры данных, которые не поддерживает сериализация Unity, вы можете использовать библиотеку .NET JSON общего назначения в качестве дополнения к JsonUtility API.
Производительность
Эталонные тесты показывают, что JsonUtility работает значительно быстрее, чем популярные решения .NET JSON, хотя в некоторых случаях этот класс предоставляет меньше функций.
Использование памяти для сборки мусора (GC) минимально:
- ToJson выделяет память GC только для возвращаемой строки.
- FromJson выделяет память GC только для возвращаемого объекта, а также для любых необходимых подобъектов (например, если вы десериализуете объект, содержащий массив, то Unity выделяет память GC для массива).
- FromJsonOverwrite выделяет память GC только по мере необходимости для записанных полей (например, строк и массивов). Это означает, что Unity вообще не выделяет память GC, если все поля, перезаписываемые JSON, имеют тип значения.
Вы можете использовать JsonUtility API из фонового потока. Однако, как и в случае с любым многопоточным кодом, будьте осторожны, чтобы не получить доступ к объекту или не изменить его в одном потоке, пока другой поток сериализует или десериализует его.
Управление выводом ToJson()
Метод ToJson поддерживает красивую печать вывода JSON. По умолчанию он отключен, но вы можете включить его, передав true в качестве второго параметра.
Вы можете исключить поля из вывода, используя атрибут [NonSerialized] .
Использование FromJson() с неизвестными типами
Если вы заранее не знаете тип объекта, десериализуйте JSON в класс или структуру, содержащую «общие» поля, а затем используйте значения этих полей, чтобы определить, какой фактический тип вам нужен. Затем выполните десериализацию во второй раз в этот тип.
Unity3d: Как сохранить словарь как объект в JSON?
Я новичок в Unity3d и C #. Я хочу хранить некоторые данные в файлах JSON, чтобы их было легко редактировать в текстовом редакторе .
До сих пор я использовал JsonUtility, потому что он был построен в Unity, и он отлично работал. Возможность использовать его так же просто, как:
Было здорово для меня.
Но теперь я добавил несколько словарей. Позже они конвертируются для более эффективных структур данных, но я хочу сериализовать их в JSON как именованные объекты.
Вот пример моего кода. Структура объектов в моем случае установлена и известна. Одиночный словарь содержит объекты одного типа, а словарь расположен глубже в иерархии сериализуемых объектов.
Чего я хочу добиться:
Есть ли способ заставить эту работу?
Может быть, это способ, которым я могу написать свои методы сериализации / десериализации для словаря?
Сериализация и десериализация Json и Json Array в Unity
У меня есть список элементов, отправленных из файла PHP в единство с использованием WWW .
В WWW.text выглядит следующим образом :
Где я обрезаю лишнее [] из string . Когда я пытаюсь разобрать его с помощью Boomlagoon.JSON , извлекается только первый объект. Я обнаружил, что у меня есть deserialize() список, и импортировал MiniJSON.
Но я не понимаю, как deserialize() этот список. Я хочу перебрать каждый объект JSON и получить данные. Как я могу сделать это в Unity с помощью C #?
Я использую класс
После обрезки [] я могу проанализировать json с помощью MiniJSON. Но возвращается только первая KeyValuePair .
Unity добавила JsonUtility в свой API после обновления 5.3.3 . Забудьте обо всех сторонних библиотеках, если вы не делаете что-то более сложное. JsonUtility быстрее, чем другие библиотеки Json. Обновите Unity до версии 5.3.3 или выше и попробуйте решение, указанное ниже.
JsonUtility это легкий API. Поддерживаются только простые типы. Он не поддерживает такие коллекции, как Dictionary. Одно исключение List . Он поддерживает List и List массив!
Если вам нужно сериализовать Dictionary или сделать что-то иное, кроме простой сериализации и десериализации простых типов данных, используйте сторонний API. В противном случае продолжайте чтение.
Пример класса для сериализации:
1. ОДИН ОБЪЕКТ ДАННЫХ (НЕ МАССИВНЫЙ JSON)
Сериализация части A :
Выполните сериализацию в Json с помощью public static string ToJson(object obj); метода.
Сериализация части B :
Выполните сериализацию в Json с помощью public static string ToJson(object obj, bool prettyPrint); перегрузки метода. Простой переход true к JsonUtility.ToJson функции отформатирует данные. Сравните вывод ниже с выводом выше.
Десериализация части A :
Десериализуйте json с помощью public static T FromJson(string json); перегрузки метода.
Десериализация части B :
Десериализация части C :
Десериализуйте json с помощью public static void FromJsonOverwrite(string json, object objectToOverwrite); метода. Когда JsonUtility.FromJsonOverwrite используется, новый экземпляр этого объекта, который вы десериализуете, создаваться не будет. Он просто повторно использует переданный вами экземпляр и перезапишет его значения.
Это эффективно, и по возможности его следует использовать.
2. НЕСКОЛЬКО ДАННЫХ (МАССИВ JSON)
Ваш Json содержит несколько объектов данных. Например playerId появлялся не раз . Unity JsonUtility не поддерживает массив, поскольку он все еще новый, но вы можете использовать вспомогательный класс от этого человека, чтобы заставить работать массив JsonUtility .
Создайте класс с именем JsonHelper . Скопируйте JsonHelper прямо снизу.
Сериализация массива Json :
Десериализация массива Json :
Если это массив Json с сервера, и вы не создали его вручную :
Я сделал для этого простую функцию:
тогда вы можете использовать его:
3. десериализация строки json без класса && десериализация Json с числовыми свойствами
Это Json, который начинается с числа или числовых свойств.
Unity JsonUtility не поддерживает это, потому что свойство «15m» начинается с числа. Переменная класса не может начинаться с целого числа.
Загрузите SimpleJSON.cs из вики Unity .
Чтобы получить недвижимость «15 миллионов долларов»:
Чтобы получить собственность «15m» в ISK:
Чтобы получить недвижимость NZD «15m»:
Остальные свойства Json, которые не начинаются с числовой цифры, могут обрабатываться Unity JsonUtility.
4.УСТРАНЕНИЕ НЕПОЛАДОК JsonUtility:
Проблемы при сериализации с помощью JsonUtility.ToJson ?
Получение пустой строки или » <> » с помощью JsonUtility.ToJson ?
. Убедитесь, что класс не является массивом. Если это так, используйте приведенный выше вспомогательный класс JsonHelper.ToJson вместо JsonUtility.ToJson .
B . Добавьте [Serializable] в начало сериализуемого класса.
C . Удалите свойство из класса. Например, в переменной public string playerId < get; set; >удалить < get; set; >. Unity не может сериализовать это.
Проблемы при десериализации с помощью JsonUtility.FromJson ?
. Если вы получили Null , убедитесь, что Json не является массивом Json. Если это так, используйте приведенный выше вспомогательный класс JsonHelper.FromJson вместо JsonUtility.FromJson .
B . Если NullReferenceException при десериализации у вас получится , добавьте [Serializable] в начало класса.
C. Любые другие проблемы, убедитесь, что ваш json действителен. Перейти на этот сайт здесь и вставьте JSON. Он должен показать вам, действителен ли json. Он также должен сгенерировать правильный класс с Json. Просто не забудьте удалить remove < get; set; >из каждой переменной, а также добавить [Serializable] в начало каждого сгенерированного класса.
Newtonsoft.Json:
Если по какой-то причине необходимо использовать Newtonsoft.Json, ознакомьтесь с разветвленной версией для Unity здесь . Обратите внимание, что при использовании определенной функции может возникнуть сбой. Быть осторожен.
Чтобы ответить на ваш вопрос :
Ваши исходные данные
Теперь у вас есть:
Для сериализации в несколько данных из PHP как массивы , теперь вы можете сделать
playerInstance[0] ваши первые данные
playerInstance[1] ваши вторые данные
playerInstance[2] это ваши третьи данные
или данные внутри класса с playerInstance[0].playerLoc , playerInstance[1].playerLoc , playerInstance[2].playerLoc .
Вы можете использовать, playerInstance.Length чтобы проверить длину, прежде чем получить к ней доступ.
ПРИМЕЧАНИЕ: Удалите < get; set; >из player класса. Если да < get; set; >, то не пойдет. Юнити JsonUtility это НЕ работать с членами класса , которые определяются как свойства .