Unity(九) 使用json保存角色信息并增、改数据以及修改json转译下的中文显示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LinZhonglong/article/details/80268346

PS:查找了很多相关资料,自己整理了下,方便日后回顾及分享。文末提供相关文件

关于LitJSon文件:可以去官网下载一个文件包;.dll文件存在于  litjson-0.5.0-bin\litjson-0.5.0\bin目录。文末提供云盘dll文件

 Litjson官网下载链接:https://sourceforge.net/projects/litjson/

下载后放入Unity的工程里即可.


**本文用Json实现对文件的增加和修改功能**



为什么用Json文件?

 正如大家熟知,Json读取快,文件小,灵活,支持的数据类型多。在项目里广泛使用。如持久化保存角色信息


相关API:

        JsonWriter  JsonData.ToJson()   JsonMapper.ToObject()

文件流读取以及创建:

      FileStream    StreamReader   Directory.CreateDirectory()

正则表达式解决Json文件被转译后不能显示中文问题:

Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})");
string modifyString = reg.Replace(oldstr, delegate (Match m) { return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); });

所需命名空间:  

using System.IO;
using LitJson;
using System;
using System.Text.RegularExpressions;

代码模块只有一个C#脚本文件,用于Unity里测试,如下:

   a:可以创建几种格式的json文件,参考链接:https://blog.csdn.net/heyuchang666/article/details/50520914

    如 {"name":"张三","职业":"法师", "任务":"寻找A村的村长"}

  

  这里我测试选择复合型的json格式,在点击OnGUI 创建并解析 后生成的json文件如上。

 创建以及解析代码--[Json的写入] 。代码生成json,也可手动创建json文件



经过正则修改格式后,使用文件流生成json文件,暂查看方便保存在目录streamingAsset下



读取json文件里的数据JsonData



测试修改Json文件里的LV等级,并重新保存JsonData


LV修改后: 1-->100

<完>


正则修改前后的对比:

 


例:如果我们拥有多名角色,保存多个角色信息,怎么办呢?

此时的json表(自己手写的json文件)

插:感觉手写更方便,把需要存的数据内容提前写好,哪怕不用。后续修改也是一样,拿出来增删都行


那么读取这个Json文件后,我们可以通过JsonData[0]["name"]找到对应的角色后再修改。参考前面读取JsonData并修改李四的LV方法



网上找到的一个正则修改json中文显示的例子:

 


关于文件流FileStream

  生成json文件也可以用StreamWriter来写入,json格式内容

 StringBuilder sb = new StringBuilder();       
        //json写入器  
 JsonWriter jw = new JsonWriter(sb); //省略写入了json内容
 FilePath = Application.dataPath + "/Data";
        //文件名称(全部的名称)  
 FileName = FilePath + "/File.json";

//创建目录  
        DirectoryInfo dir = new DirectoryInfo(path);

        //判断目录是否存在  
        if (dir.Exists)
        {
            print("此目录已经存在");
        }
        else//不存在的话,创建出来   
        {
            Directory.CreateDirectory(path);
            print("创建目录成功");
#if UNITY_EDITOR
            //如果在编辑器下的话,刷新pproject视图  
            AssetDatabase.Refresh();
#endif
        }
        StreamWriter sw; //写入流  
        if (File.Exists(name))
        {
            print("文件已经存在,我们要添加数据");
            sw = File.AppendText(name);
        }
        else
        {
            sw = File.CreateText(name);
            print("创建文件成功,开始写入数据");
        }
        /* 此处正则修改中文后,在UNITY里可以看到是中文,VS打开Json文件后乱码了
         
        Regex reg = new Regex(@"(?i)\\[uU]([0-9a-f]{4})");
        string mf = reg.Replace(sb.ToString(), delegate (Match m) { return ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString(); });
        */
         
  //通过流去写入数据
        sw.Write(sb);
        //关闭流  
        sw.Close();
        //销毁流  
        sw.Dispose();


关于在Json文件中增加新的内容

 
void AddNewData()
    {
        StringBuilder sb = new StringBuilder();
        JsonWriter jw = new JsonWriter(sb);
       
        StreamWriter sw; //写入流  
        if (File.Exists(FileName))
        {
            print("文件已经存在,我们要添加数据");
            sw = File.AppendText(FileName);          
        }
        else
        {
            sw = File.CreateText(FileName);
            print("创建文件成功,开始写入数据");
        }

        //在原Json数据中继续追加新的内容
        jw.WriteObjectStart();
        //先写入键,再写入值(以下是两组键值)  
        jw.WritePropertyName("new_name");
        jw.Write("lin");
        jw.WritePropertyName("count");
        jw.Write("155");
        jw.WriteObjectEnd();

        //通过流去写入数据  
        sw.Write(sb);
        //关闭流  
        sw.Close();
        //销毁流  
        sw.Dispose();
    }





使用JSON遇到的问题:

 1:    static Dictionary<string,string> test = new Dictionary<string, string>();

          string values = JsonMapper.ToJson(test);

  根据Json提供的API,JsonMapper.ToJson(object obj),可以把字典数据转换成json这是OK的,换了<int,int>无法转换,  <(int)id, (class)PlayerInfo>也不行。暂时没懂原因,后来查了json存入键值对,键是String类型即可<string,int>可行

2:遍历JsonData得到文件流读取到的数据,很像Dictionary[,]但它是JsonData数据

JsonData values = JsonMapper.ToObject(sr.ReadToEnd());

        foreach (var item in values)
        {
            Debug.Log(item);
        }

暂时我只能values["name"]取得名字,values["Info"]["LV"]这样取得我需要的数据,尴尬。

或者说如果[key]异常也不行

不过根据索引读取效率会很快


继续研究补充中...................

两种Json格式



相应文件提供:

1:脚本以及LitJson.dll文件  https://pan.baidu.com/s/1Ue9Qpd0qRvc8HWqOeVIROA 


本文参考链接:感谢原作者

1:https://zhuanlan.zhihu.com/p/24283441 知乎

2:https://blog.csdn.net/heyuchang666/article/details/50520914 Json的创建以及解析

3:https://blog.csdn.net/XIAO_11_DONG/article/details/75128953

4:https://blog.csdn.net/BuladeMian/article/details/78518903 单数据保存,快捷方便


欢迎指正

PS:苟日新,日日新,日又新!

猜你喜欢

转载自blog.csdn.net/LinZhonglong/article/details/80268346