在 Unity 代码中使用 JSON 的内置方式

JSON(JavaScript 对象表示法)是一种广泛使用的数据交换格式,将其集成到 Unity 中可以非常有效地处理配置、保存游戏进度或与外部服务交换数据。本指南将引导您了解在 Unity 中使用 JSON 的基础知识。

第 1 步:了解 JSON

JSON 由键值对和嵌套结构组成。

步骤 2:在 Unity 代码中使用 JSON

Unity 通过其 'JsonUtility' 类简化 JSON 序列化和反序列化。本指南演示了在没有外部库的情况下在 Unity 中使用 JSON 的基本步骤。

  • 创建 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 序列化和反序列化,无需外部库。使用此本机方法在 Unity 项目中进行简单的 JSON 操作。

推荐文章
在 Unity 中实现对象池
在 Unity 中创建子弹时间效果
在 Unity 中创建交互式对象
在 Unity 中实现动力学交互
在 Unity 中使用特定钥匙打开抽屉和橱柜
在 Unity 中添加玩家进入汽车
在 Unity 中使用运行时动画控制器