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:苟日新,日日新,日又新!