Cách làm việc tích hợp với JSON trong Unity Code

JSON (Ký hiệu đối tượng JavaScript) là định dạng trao đổi dữ liệu được sử dụng rộng rãi và việc tích hợp nó vào Unity có thể mang lại hiệu quả mạnh mẽ trong việc xử lý cấu hình, lưu tiến trình trò chơi hoặc trao đổi dữ liệu với các dịch vụ bên ngoài. Hướng dẫn này hướng dẫn bạn các nguyên tắc cơ bản khi làm việc với JSON trong Unity.

Bước 1: Tìm hiểu JSON

JSON bao gồm các cặp khóa-giá trị và cấu trúc lồng nhau.

Bước 2: Làm việc với JSON trong mã Unity

Unity đơn giản hóa quá trình tuần tự hóa và giải tuần tự hóa JSON thông qua lớp 'JsonUtility' của nó. Hướng dẫn này trình bày các bước cơ bản để làm việc với JSON trong Unity mà không cần thư viện bên ngoài.

  • Tạo cấu trúc JSON:
{
  "playerName": "John Doe",
  "playerLevel": 5,
  "inventory": ["sword", "shield"]
}
  • Tuần tự hóa - Chuyển đổi đối tượng C# thành 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);
    }
}
  • Deserialization - Chuyển đổi JSON thành đối tượng 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));
    }
}

Những hạn chế đã biết

'JsonUtility' không trực tiếp hỗ trợ việc tuần tự hóa và giải tuần tự hóa các mảng đối tượng cấp cao nhất (ví dụ: '[{},{},{}]') mà không có lớp gói. Để giải quyết vấn đề này, bạn có thể sử dụng lớp trợ giúp để bao bọc mảng. Đây là một ví dụ:

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

Trong ví dụ trên, lớp 'PlayerDataArrayWrapper' được sử dụng để bao bọc mảng khi tuần tự hóa và giải tuần tự hóa. Thực tế phổ biến là tạo các lớp trình bao bọc như vậy khi xử lý các mảng đối tượng cấp cao nhất trong 'JsonUtility'.

Phần kết luận

'JsonUtility' đơn giản hóa quá trình tuần tự hóa và giải tuần tự hóa JSON trực tiếp mà không cần thư viện bên ngoài. Sử dụng phương pháp gốc này cho các thao tác JSON đơn giản trong các dự án Unity.