Menu
CoddyTech

JsonUtility

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 30 de 64.

JSON é um texto que contém os valores de um objeto, para que ele possa ser registrado em log, enviado ou gravado em um arquivo. JsonUtility.ToJson(obj) transforma um objeto em JSON e JsonUtility.FromJson<T>(json) cria um novo T a partir dele. JsonUtility segue as mesmas regras do Inspector, então funciona com uma classe [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);

secretCode e Rank estão ausentes. JsonUtility grava campos públicos e campos privados marcados com [SerializeField], e nada mais: nenhuma propriedade, nenhum campo estático, nenhum campo privado comum. Um campo Dictionary também é ignorado, assim como um campo cuja classe não seja [System.Serializable]. Esses também são os campos que o Inspector omite. JsonUtility.ToJson(obj, true) grava o mesmo JSON distribuído em várias linhas, mais fácil de ler.

Uma lista dentro de uma classe é gravada, como acontece com badges. Uma lista sozinha não é: JsonUtility precisa de um objeto no nível superior, então JsonUtility.ToJson(scores) para um List<int> com 10, 20 e 30 retorna {}. Coloque a lista em uma classe e converta essa classe; um ScoreBoard que contém a mesma lista é gravado como {"scores":[10,20,30]}:

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

Desafio

Médio

Compartilhe a equipe como um código JSON.

  1. Em CharacterBuild, torne Strength um campo, public int strength;, e marque agility com [SerializeField].
  2. Abaixo dele, escreva uma classe Team com [System.Serializable] e public List<CharacterBuild> heroes;. Em TeamCode, torne a lista public Team team; e registre seu JSON.
  3. LoadCode lê code em team e registra Loaded 3 heroes.

Pressione “Jogar” e pressione Espaço: a equipe será exibida como JSON. Em seguida, clique em “Verificar”.

Experimente você mesmo

using System.Collections.Generic;
using UnityEngine;

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

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity