Forma integrada de trabajar con JSON en código Unity

JSON (JavaScript Object Notation) es un formato de intercambio de datos ampliamente utilizado e integrarlo en Unity puede ser poderoso para manejar configuraciones, guardar el progreso del juego o intercambiar datos con servicios externos. Esta guía lo guía a través de los fundamentos del trabajo con JSON en Unity.

Paso 1: entender JSON

JSON consta de pares clave-valor y estructuras anidadas.

Paso 2: Trabajar con JSON en código Unity

Unity simplifica la serialización y deserialización JSON a través de su clase 'JsonUtility'. Esta guía demuestra los pasos básicos para trabajar con JSON en Unity sin bibliotecas externas.

  • Cree una estructura JSON:
{
  "playerName": "John Doe",
  "playerLevel": 5,
  "inventory": ["sword", "shield"]
}
  • Serialización: conversión de objetos C# a 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);
    }
}
  • Deserialización: conversión de JSON a objeto 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));
    }
}

Limitaciones conocidas

'JsonUtility' no admite directamente la serialización y deserialización de matrices de objetos de nivel superior (por ejemplo, '[{},{},{}]') sin una clase envolvente. Para solucionar este problema, puede utilizar una clase auxiliar para ajustar la matriz. He aquí un ejemplo:

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

En el ejemplo anterior, la clase 'PlayerDataArrayWrapper' se utiliza para ajustar la matriz al serializar y deserializar. Es una práctica común crear este tipo de clases contenedoras cuando se trata de matrices de objetos de nivel superior en 'JsonUtility'.

Conclusión

'JsonUtility' simplifica la serialización y deserialización JSON directamente sin bibliotecas externas. Utilice este enfoque nativo para operaciones JSON sencillas en proyectos Unity.

Artículos sugeridos
Un enfoque práctico del código modular en Unity
Trabajar con Arrays y Listas en Unity Code
Trabajar con cadenas y manipular datos de texto en Unity
Cómo convertirse en un mejor programador en Unity
Creando un efecto de tiempo bala en Unity
Una guía para integrar el controlador de Nintendo con Unity
Principales fragmentos de código útiles para desarrolladores de Unity