Unity:JsonUtility序列化List链表数据(将多个对象存储到单个json文件中)

在游戏开发过程中,如果要实现如分数排行榜这样的功能,就需要把多个同样的对象存储进同一个json文件中。

这个时候,我们可以试着,创建一个分数对象的链表,然后每结算一次分数,就向分数链表中添加一次分数对象,最后再将链表序列化成json文本存入文件就可以了。代码如下:

[Serializable]
public class Score //分数类
{
    [SerializeField]private float Score;
    [SerializeField]private string Name;
    
    public Score(string n, float s) { Name = n; Score = s; }

}

[SerializeField]private List<Score> ScoreList;
private string path =Application.persistentDataPath + "ScoreList.json";

void Awake()
{
    //添加分数对象到链表
    ScoreList.Add(new Score("player",100));
    var json = JsonUtility.ToJson(ScoreList);
    if (json!=null)
    {
        File.WriteAllText(path, json);
    }
}

但是,当我们打开保存的json文件时,就会发现,里面没有任何数据,如下图所示:

img

这是因为JsonUtility无法直接序列化链表及字典数据,需要对其进行一次封装

所以我们需要创建一个类来封装我们的链表

[SerializeField]
public class GameSaveData
{
    [SerializeField] private List<Score> ScoreList;

    public  GameSaveDatas()
    {
        //在构造函数中初始化链表
        ScoreList = new List<Score>();
    }

    public void Add(Score score)
    {
        ScoreList.Add(score);  
    }

}

最终代码

[Serializable]
public class Score //分数类
{
    [SerializeField]private float Score;
    [SerializeField]private string Name;
    
    public Score(string n, float s) { Name = n; Score = s; }

}

[SerializeField]
public class GameSaveData //存储分数链表的类
{
    [SerializeField] private List<Score> ScoreList;

    public  GameSaveDatas()
    {
        //在构造函数中初始化链表
        ScoreList = new List<Score>();
    }

    public void Add(Score score)
    {
        ScoreList.Add(score);  
    }

}

[SerializeField]private GameSaveData gameSaveData;
private string path = Application.persistentDataPath + "ScoreList.json";

void Awake()
{
    //添加分数对象到链表
    gameSaveData.Add(new Score("player",100));
    var json = JsonUtility.ToJson(gameSaveData);
    if (json!=null)
    {
        File.WriteAllText(path, json);
    }
}

最终输出结果

img

最后修改:2023 年 11 月 12 日
如果觉得我的文章对你有用,请随意赞赏