Unity как шифровать данные в json
Перейти к содержимому

Unity как шифровать данные в json

Сериализация 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 это НЕ работать с членами класса , которые определяются как свойства .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *