Json数据持久化-Newtonsoft

114 阅读1分钟
   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("本地存档读取赋值成功");
        }
    }