Integrierte Arbeitsweise mit JSON in Unity Code

JSON (JavaScript Object Notation) ist ein weit verbreitetes Datenaustauschformat und seine Integration in Unity kann für die Verwaltung von Konfigurationen, das Speichern des Spielfortschritts oder den Datenaustausch mit externen Diensten hilfreich sein. Dieser Leitfaden führt Sie durch die Grundlagen der Arbeit mit JSON in Unity.

Schritt 1: JSON verstehen

JSON besteht aus Schlüssel-Wert-Paaren und verschachtelten Strukturen.

Schritt 2: Arbeiten mit JSON im Unity-Code

Unity vereinfacht die JSON-Serialisierung und -Deserialisierung durch die Klasse 'JsonUtility'. Diese Anleitung zeigt die grundlegenden Schritte zum Arbeiten mit JSON in Unity ohne externe Bibliotheken.

  • Erstellen Sie eine JSON-Struktur:
{
  "playerName": "John Doe",
  "playerLevel": 5,
  "inventory": ["sword", "shield"]
}
  • Serialisierung – C#-Objekt in JSON konvertieren:
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);
    }
}
  • Deserialisierung – Konvertieren von JSON in ein C#-Objekt:
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));
    }
}

Bekannte Einschränkungen

'JsonUtility' unterstützt nicht direkt die Serialisierung und Deserialisierung von Arrays von Objekten der obersten Ebene (z. B. '[{},{},{}]') ohne eine Wrapping-Klasse. Um dies zu umgehen, können Sie das Array mit einer Hilfsklasse umschließen. Hier ist ein Beispiel:

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

Im obigen Beispiel wird die Klasse 'PlayerDataArrayWrapper' verwendet, um das Array beim Serialisieren und Deserialisieren zu umschließen. Es ist eine gängige Praxis, solche Wrapper-Klassen zu erstellen, wenn es um Arrays von Objekten der obersten Ebene in 'JsonUtility' geht.

Abschluss

'JsonUtility' vereinfacht die JSON-Serialisierung und Deserialisierung direkt ohne externe Bibliotheken. Verwenden Sie diesen nativen Ansatz für einfache JSON-Vorgänge in Unity-Projekten.