Menu
CoddyTech

JsonUtility

Thuộc phần Kiến trúc trò chơi trong Unity trong hành trình Unity của Coddy. Bài học 30 trên 64.

JSON là văn bản chứa các giá trị của một đối tượng, nên bạn có thể ghi nhật ký, gửi hoặc ghi nó vào tệp. JsonUtility.ToJson(obj) chuyển một đối tượng thành JSON, còn JsonUtility.FromJson<T>(json) tạo một T mới từ JSON đó. JsonUtility tuân theo các quy tắc của Inspector, nên có thể dùng với lớp [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 và Rank không xuất hiện. JsonUtility ghi các trường public và các trường private có đánh dấu [SerializeField], không ghi gì khác: không ghi thuộc tính, trường static hay trường private thông thường. Trường kiểu Dictionary cũng bị bỏ qua, và trường có lớp không được đánh dấu [System.Serializable] cũng vậy. Inspector cũng bỏ qua những trường đó. JsonUtility.ToJson(obj, true) ghi cùng một JSON nhưng trải trên nhiều dòng, giúp bạn dễ đọc hơn.

Danh sách bên trong một lớp sẽ được ghi, như badges. Danh sách đứng riêng thì không: JsonUtility cần một đối tượng ở ngoài cùng, nên JsonUtility.ToJson(scores) với một List<int> chứa 10, 20 và 30 sẽ trả về {}. Hãy đặt danh sách vào một lớp rồi chuyển đổi lớp đó. Một ScoreBoard chứa cùng danh sách sẽ được ghi thành {"scores":[10,20,30]}:

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

Thử thách

Trung bình

Chia sẻ đội dưới dạng đoạn code JSON.

  1. Trong CharacterBuild, tạo Strength thành một trường, public int strength;, và đánh dấu agility bằng [SerializeField].
  2. Bên dưới, viết một lớp [System.Serializable] tên là Team với public List<CharacterBuild> heroes;. Trong TeamCode, khai báo danh sách bằng public Team team; rồi ghi nhật ký JSON của danh sách.
  3. LoadCode đọc code vào team rồi ghi nhật ký Loaded 3 heroes.

Nhấn Chơi rồi nhấn Space: đội sẽ hiển thị dưới dạng JSON. Sau đó nhấn Kiểm tra.

Tự làm thử

using System.Collections.Generic;
using UnityEngine;

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

Tất cả bài học trong Kiến trúc trò chơi trong Unity

Tự luyện tập: Playground Unity