Menu
CoddyTech

JsonUtility

Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 30 de 64.

JSON es texto que contiene los valores de un objeto, por lo que se puede registrar, enviar o escribir en un archivo. JsonUtility.ToJson(obj) convierte un objeto en JSON y JsonUtility.FromJson<T>(json) crea un nuevo T a partir de él. JsonUtility sigue las mismas reglas que el Inspector, por lo que funciona con una clase [System.Serializable]:

[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);

Faltan secretCode y Rank. JsonUtility escribe los campos públicos y los campos privados marcados con [SerializeField], y nada más: no escribe propiedades, campos estáticos ni campos privados sin atributos. También omite los campos de tipo Dictionary y aquellos cuya clase no es [System.Serializable]. El Inspector también omite esos campos. JsonUtility.ToJson(obj, true) escribe el mismo JSON distribuido en varias líneas, lo que facilita su lectura.

Se escribe una lista dentro de una clase, como ocurre con badges. Una lista por sí sola no se escribe: JsonUtility necesita un objeto en el nivel superior, así que JsonUtility.ToJson(scores) para una List<int> con los valores 10, 20 y 30 devuelve {}. Incluye la lista en una clase y conviértela; un ScoreBoard que contiene la misma lista se escribe como {"scores":[10,20,30]}:

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

Desafío

Intermedio

Comparte el equipo como código JSON.

  1. En CharacterBuild, convierte Strength en un campo, public int strength;, y marca agility con [SerializeField].
  2. Debajo, escribe una clase Team [System.Serializable] con public List<CharacterBuild> heroes;. En TeamCode, declara la lista como public Team team; y registra su JSON.
  3. LoadCode lee code en team y registra Loaded 3 heroes.

Pulsa «Jugar» y luego la barra espaciadora: el equipo se muestra como JSON. Después, pulsa «Comprobar».

Pruébalo tú mismo

using System.Collections.Generic;
using UnityEngine;

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

Todas las lecciones de Arquitectura de juegos en Unity

Practica por tu cuenta: Playground de Unity