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文件时,就会发现,里面没有任何数据,如下图所示:
这是因为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);
}
}
最终输出结果: