Встроенный способ работы с JSON в коде Unity

JSON (нотация объектов JavaScript) — это широко используемый формат обмена данными, и его интеграция в Unity может быть полезна для обработки конфигураций, сохранения прогресса игры или обмена данными с внешними службами. Это руководство познакомит вас с основами работы с JSON в Unity.

Шаг 1. Понимание JSON

JSON состоит из пар ключ-значение и вложенных структур.

Шаг 2. Работа с JSON в коде Unity

Unity упрощает сериализацию и десериализацию JSON с помощью класса 'JsonUtility'. В этом руководстве показаны основные шаги по работе с JSON в Unity без внешних библиотек.

  • Создайте структуру JSON:
{
  "playerName": "John Doe",
  "playerLevel": 5,
  "inventory": ["sword", "shield"]
}
  • Сериализация — преобразование объекта C# в JSON:
using UnityEngine;

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int playerLevel;
    public string[] inventory;
}

public class SerializationExample : MonoBehaviour
{
    void Start()
    {
        PlayerData playerData = new PlayerData
        {
            playerName = "John Doe",
            playerLevel = 5,
            inventory = new string[] { "sword", "shield" }
        };

        string json = JsonUtility.ToJson(playerData);
        Debug.Log(json);
    }
}
  • Десериализация — преобразование JSON в объект C#:
using UnityEngine;

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int playerLevel;
    public string[] inventory;
}

public class DeserializationExample : MonoBehaviour
{
    void Start()
    {
        string jsonData = "{\"playerName\":\"John Doe\",\"playerLevel\":5,\"inventory\":[\"sword\",\"shield\"]}";
        PlayerData playerData = JsonUtility.FromJson<PlayerData>(jsonData);

        Debug.Log($"Name: {playerData.playerName}, Level: {playerData.playerLevel}");
        Debug.Log("Inventory: " + string.Join(", ", playerData.inventory));
    }
}

Известные ограничения

'JsonUtility' не поддерживает напрямую сериализацию и десериализацию массивов объектов верхнего уровня (например, '[{},{},{}]') без класса-оболочки. Чтобы обойти эту проблему, вы можете использовать вспомогательный класс для переноса массива. Вот пример:

using UnityEngine;

[System.Serializable]
public class PlayerData
{
    public string playerName;
    public int playerLevel;
}

[System.Serializable]
public class PlayerDataArrayWrapper
{
    public PlayerData[] players;
}

public class TopLevelArrayExample : MonoBehaviour
{
    void Start()
    {
        // Serialization: Converting C# Object Array to JSON
        PlayerData[] players = new PlayerData[]
        {
            new PlayerData { playerName = "John Doe", playerLevel = 5 },
            new PlayerData { playerName = "Jane Smith", playerLevel = 8 }
        };

        PlayerDataArrayWrapper wrapper = new PlayerDataArrayWrapper { players = players };
        string json = JsonUtility.ToJson(wrapper);
        Debug.Log(json);

        // Deserialization: Converting JSON to C# Object Array
        string jsonData = "{\"players\":[{\"playerName\":\"John Doe\",\"playerLevel\":5},{\"playerName\":\"Jane Smith\",\"playerLevel\":8}]}";
        PlayerDataArrayWrapper deserializedData = JsonUtility.FromJson<PlayerDataArrayWrapper>(jsonData);

        foreach (var player in deserializedData.players)
        {
            Debug.Log($"Name: {player.playerName}, Level: {player.playerLevel}");
        }
    }
}

В приведенном выше примере класс 'PlayerDataArrayWrapper' используется для переноса массива при сериализации и десериализации. Создание таких классов-оболочек является обычной практикой при работе с массивами объектов верхнего уровня в 'JsonUtility'.

Заключение

'JsonUtility' упрощает сериализацию и десериализацию JSON напрямую, без внешних библиотек. Используйте этот собственный подход для простых операций JSON в проектах Unity.

Рекомендуемые статьи
Обработка исключений и ошибок в коде Unity
Реализация наследования и полиморфизма в коде Unity
Создание классов и объектов в коде Unity
Работа с массивами и списками в коде Unity
Реализация управления VR-гарнитурой в Unity
Создание эффекта дрожания камеры в Unity
Создание ScriptableObjects в Unity