JsonUtility可以实现对象的序列化和反序列化,但是在反序列化的过程中,JsonUtlity无法直接
读取数据集合,需要在json文件中包裹一层对象("对象名":[...])
list转json
反射获得的object变量用as或者()转为List的时候,有时会转换失败
所以这时直接用object类型的变量参与到Serialize函数中进行序列化
JsonConvert会得到正确的结果
List<UserInfo> list = new List<UserInfo>();
list.Add(user);
JsonSerializer serializer = new JsonSerializer();
StringWriter sw = new StringWriter();
serializer.Serialize(new JsonTextWriter(sw), list);
string result = sw.GetStringBuilder().ToString();
json转list
var list = JsonConvert.DeserializeObject<List<Person>>(json);
在使用Newtonsoft插件对数据进行持久化时,实体类的构造形式没有变化,在写入和读取数据时,仅仅将JsonUtility替换为JsonConvert即可。
写入数据
private void SaveDatasJsonByNewtonsoft()
{
Players player = new Players();
player.name = "Newtonsoft";
player.playerSaveDatas.Add(data);
player.playerSaveDatas.Add(data1);
//方式1:使用Newtonsoft.Json序列化数据
string json = JsonConvert.SerializeObject(player);
//根据文件路径,创建/打开目标文件,使用到I/O;
StreamWriter writer = new StreamWriter(DataManager.Instance.GetPlayerDataPath());
//将json数据写入文件中
writer.WriteLine(json);
//关闭数据流
writer.Close();
Debug.Log("使用Newtonsoft存储数据完毕");
}
读取数据
private void ReadDatasJsonByNewtonsoft()
{
if (!File.Exists(DataManager.Instance.GetPlayerDataPath()))
{
Debug.Log("找不到存档文件");
}
else
{
Players players = new Players();
//根据文件路径创建数据流
StreamReader reader = new StreamReader(DataManager.Instance.GetPlayerDataPath());
//读取json数据
string json = reader.ReadToEnd();
//关闭数据流
reader.Close();
//将获取到的Json数据转为Datas类数据,使用NewTonsoft.Json,反序列化数据
Players saveData = JsonConvert.DeserializeObject<Players>(json);
//Players saveData = JsonUtility.FromJson<Players>(json);
// Debug.LogFormat("name={0}", saveData.name);
foreach (var item in saveData.playerSaveDatas)
{
Debug.Log(item.ToString());
}
//把读取的数据赋值给目标对象
// Debug.LogError(saveData.versionId);
Debug.Log("本地存档读取赋值成功");
}
}