Menu
CoddyTech

JsonUtility

Часть раздела Архитектура игр в Unity путешествия по Unity на Coddy. Урок 30 из 64.

JSON — это текст, содержащий значения объекта, поэтому его можно записать в журнал, отправить или сохранить в файл. JsonUtility.ToJson(obj) преобразует объект в JSON, а JsonUtility.FromJson<T>(json) создаёт из него новый объект T. JsonUtility следует тем же правилам, что и Inspector, поэтому он работает с классом [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 и Rank отсутствуют. JsonUtility записывает публичные поля и приватные поля с атрибутом [SerializeField], и ничего больше: ни свойства, ни статические поля, ни обычные приватные поля. Поле типа Dictionary тоже пропускается, как и поле, класс которого не помечен атрибутом [System.Serializable]. Именно такие поля Inspector тоже не отображает. JsonUtility.ToJson(obj, true) записывает тот же JSON, разбитый на несколько строк, чтобы его было проще читать.

Список внутри класса записывается, как это происходит с badges. Отдельный список не записывается: JsonUtility требует, чтобы в корне находился объект, поэтому вызов JsonUtility.ToJson(scores) для List<int> со значениями 10, 20 и 30 возвращает {}. Помести список в класс и преобразуй его; объект ScoreBoard с таким же списком записывается как {"scores":[10,20,30]}:

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

Задание

Средне

Поделись командой в виде JSON-кода.

  1. В CharacterBuild сделай силу полем: public int strength;, а agility пометь атрибутом [SerializeField].
  2. Ниже напиши класс Team с атрибутом [System.Serializable] и полем public List<CharacterBuild> heroes;. В TeamCode создай список public Team team; и выведи его JSON в журнал.
  3. LoadCode загружает code в team и выводит в журнал Loaded 3 heroes.

Нажми «Играть» и нажми пробел: команда отобразится в виде JSON. Затем нажми «Проверить».

Попробуйте сами

using System.Collections.Generic;
using UnityEngine;

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

Все уроки раздела Архитектура игр в Unity

Потренируйтесь самостоятельно: Песочница Unity