Menu
CoddyTech

JsonUtility

Teil des Abschnitts Spielarchitektur in Unity der Unity-Journey von Coddy. Lektion 30 von 64.

JSON ist Text, der die Werte eines Objekts enthält, damit er protokolliert, versendet oder in eine Datei geschrieben werden kann. JsonUtility.ToJson(obj) wandelt ein Objekt in JSON um, und JsonUtility.FromJson<T>(json) erstellt daraus ein neues T. JsonUtility befolgt dieselben Regeln wie der Inspector und funktioniert daher mit einer Klasse, die mit [System.Serializable] markiert ist:

[System.Serializable]
public class PlayerProfile
{
    public string playerName = "Ana";
    public int level = 7;
    public List<string> badges = new List<string> { "Explorer", "Sharpshooter" };
    [SerializeField] private float hoursPlayed = 12.5f;
    private int secretCode = 1234;
    public int Rank { get; set; } = 3;
}
string json = JsonUtility.ToJson(new PlayerProfile());
// {"playerName":"Ana","level":7,"badges":["Explorer","Sharpshooter"],"hoursPlayed":12.5}
PlayerProfile copy = JsonUtility.FromJson<PlayerProfile>(json);

secretCode und Rank fehlen. JsonUtility schreibt öffentliche Felder und private Felder, die mit [SerializeField] markiert sind, und sonst nichts: keine Eigenschaften, keine statischen Felder, keine gewöhnlichen privaten Felder. Auch ein Dictionary-Feld wird übersprungen, ebenso ein Feld, dessen Klasse nicht mit [System.Serializable] markiert ist. Diese Felder lässt auch der Inspector aus. JsonUtility.ToJson(obj, true) schreibt dasselbe JSON auf mehrere Zeilen verteilt, sodass es leichter zu lesen ist.

Eine Liste innerhalb einer Klasse wird geschrieben, wie es bei badges der Fall ist. Eine Liste für sich allein dagegen nicht: JsonUtility benötigt ganz oben ein Objekt, daher gibt JsonUtility.ToJson(scores) für eine List<int> mit 10, 20 und 30 {} zurück. Packe die Liste in eine Klasse und wandle diese um; ein ScoreBoard mit derselben Liste wird als {"scores":[10,20,30]} geschrieben:

[System.Serializable]
public class ScoreBoard
{
    public List<int> scores;
}
challenge icon

Aufgabe

Mittel

Teile das Team als JSON-Code.

  1. Mach in CharacterBuild Strength zu einem Feld: public int strength;, und markiere agility mit [SerializeField].
  2. Schreibe darunter eine Klasse Team mit [System.Serializable] und public List<CharacterBuild> heroes;. Mach in TeamCode die Liste zu public Team team; und gib ihr JSON aus.
  3. LoadCode liest code in team ein und gibt Loaded 3 heroes aus.

Drücke auf „Spielen“ und dann die Leertaste: Das Team wird als JSON angezeigt. Klicke dann auf „Prüfen“.

Probier es selbst

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class CharacterBuild
{
    public string hero;
    public int Strength { get; set; }
    private int agility;
}

Alle Lektionen in Spielarchitektur in Unity

Übe selbstständig: Unity-Playground