JSON:
json是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据,易于人阅读和编写,
同时也易于机器解析和生成,并有效地提升网络传输效率。
格式:同样是以键值对的格式存储,并列关系用{}括起来,用“,”隔开,当值有子对象时[]括起来
{键:值,键:值,键:[{键:值,键:值,键:值},{键:值,键:值,键:值}]
}
例:
{
"hero":"诺克萨斯之手",
"hp":"582.24",
"ap":"55.88",
"Skill":
[
{"key":"q","name":"大杀四方","cd":"9","expend":"30"},
{"key":"w","name":"致残打击","cd":"9","expend":"30"},
{"key":"e","name":"无情铁手","cd":"24","expend":"50"},
{"key":"r","name":"诺克萨断头台","cd":"120","expend":"100"}
]
}
运用到Unity中:
1.新建一个TXT文件,转换成.JSON格式的文件,拖拽到Unity工程目录下,打开,将上段Json格式的数据输入进去。
2.读取json数据:
需要引入动态链接库,各大论坛上都有下载,直接导入就可以了。
然后建立脚本,首先引入命名空间:
using LitJson; //对json操作的命名空间
using System.Text;//
using System.IO;
using UnityEditor;
void Start ()
{
ReadJsonFromFile ();
} /// <summary>
/// 读取json数据
/// </summary>
void ReadJson(){
string str =
@"{
'name':'UnityClass',
'id':'1000',
'student':
[
{'stuid':'1001','stuname':'丁义珍','score':'100'},
{'stuid':'1002','stuname':'孙连城','score':'99'}
]
}";
//解析,将Json格式化字符串转化为对象,并将这些信息保存到jsondata对象当中
JsonData jd = JsonMapper.ToObject(str);
//json相当于键值对,交叉数组,通过值找到对应的名称
print ("name:"+jd["name"]);
print ("id:"+jd["id"]);
//用JsonData对象保存jd里面的“student”(也相当于键值对数组)信息
JsonData jdStu = jd ["student"];
print ("一共拥有多少个学生:"+ jdStu.Count);
for (int i = 0; i < jdStu.Count; i++) {
print ("stuid"+jdStu[i]["stuid"]);
print ("stuname:" + jdStu[i]["stuname"]);
print ("score" + jdStu [i] ["score"]);
}
}3.读取Json文件:
接受刚才导入的JSon文件 heroinfotxt
同样以键值对的方式读取。
public TextAsset TA;//文本资源
/// <summary>
/// 读取json文件
/// </summary>
void ReadJsonFromFile(){
JsonData jd = JsonMapper.ToObject (TA.text);
// JsonData jdHero = jd ["hero"];
for (int i = 0; i < jd["hero"].Count ; i++) {
print(jd["hero"][i]["Name"]+ ":"+ jd["hero"][i]["hp"]);
}
}
4.写入Json数据
以键值对的方式写入,一个键对应一个值,或者是数组,
注意开始写入数据获开始写入数组时都要要写 jw.WriteObjectStart ();
结束写入时要写 jw.WriteObjectEnd();
stringBuilder的用法和String一样但是前者不会随着存储内容的改变而重新开辟空间。
sw.WriteLine (sb);是写入的关键步骤。
基本思路:
1.创建存储string空间
2.创建写入器
3.写入数据
4.创建目录
5.判断路径,添加路径
6.创建写入流
7.判断文件名,添加文件名
8.wirteLine(sb),写入
9.关闭写入流
10.销毁写入流
void Start ()
{
FilePath = Application.dataPath + "/3.Json/Data";
FileName = FilePath + "/NewFile.json";
}
void Update ()
{
if (Input.GetKeyDown(KeyCode.W)) {
WriteJsonToFile (FilePath,FileName);
}
}
/// <summary>
/// 写入json数据
/// </summary>
/// <param name="path">Path.文件路径</param>
/// <param name="name">Name.文件名字</param>
void WriteJsonToFile(string path , string name){
StringBuilder sb = new StringBuilder ();
//json写入器
JsonWriter jw = new JsonWriter (sb);
//开始写入数据
jw.WriteObjectStart ();
//先写入键,在写对应的值
jw.WritePropertyName ("Class_Name");
jw.Write ("UnityClass");
jw.WritePropertyName("person_count");
jw.Write ("15");
//如果想写入一个数组,首先写键(数组的名)
jw.WritePropertyName ("self_info");
//开始一个数组的写入
jw.WriteArrayStart ();
//01.在数组里面也需要定义开始写入数据(每一个阶的数组的写入都选要写数组的开始写入,和结束写入)
jw.WriteObjectStart ();
jw.WritePropertyName ("stu_name");
jw.Write("赵立春");
jw.WritePropertyName ("stu_height");
jw.Write ("180");
jw.WritePropertyName ("stu_Weight");
jw.Write ("80");
//结束数组里面的写入数据
jw.WriteObjectEnd();
//02.开始数据的写入
jw.WriteObjectStart();
jw.WritePropertyName ("stu_name");
jw.Write ("祁同伟");
jw.WritePropertyName ("stu_height");
jw.Write ("200");
jw.WritePropertyName ("stu_weight");
jw.Write ("100");
//结束数据的写入
jw.WriteObjectEnd ();
//结束数组的写入
jw.WriteArrayEnd ();
//结束写入数据
jw.WriteObjectEnd();
//打印sb这个json里的数据
print (sb);
//创建目录
DirectoryInfo dir = new DirectoryInfo(path);
//判断目录是否存在
if (dir.Exists) {
print ("此目录已经存在");
} else {//不存在的话,常见出来
Directory.CreateDirectory (path);
print ("创建目录成功");
}
#if UNITY_EDITOR
//如果在编辑器下的话,刷新project视图
AssetDatabase.Refresh();
#endif
//创建写入流
StreamWriter sw;
if (File.Exists(name)) {
print ("文件存在,我们要添加数据了");
sw = File.AppendText (name);
} else {
sw = File.CreateText (name);
print ("创建文件成功,开始写入数据");
}
//通过流去写入数据
sw.WriteLine (sb);
//关闭流
sw.Close();
//销毁流
sw.Dispose();
#if UNITY_EDITOR
AssetDatabase.Refresh();
#endif
}