- Json( JavaScript Object Notation ) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 Json采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、Java、JavaScript、Perl、Python、C# 等)。这些特性使Json成为理想的数据交换语言,易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
- Json 语法是 JavaScript 对象表示语法的子集。
* 数据由逗号分隔
* 花括号保存对象
* 方括号保存数组
- 常用Json库:
* Json.NET :.NET自带的JSON库,缺点:比较臃肿
* MiniJson:不支持自定义的序列化
* LitJson:IOS平台支持不太友好,只做Android平台可以考虑使用
- (本文所述项目使用LitJson,开始项目之前,将库脚本或动态库(LitJson.dll)置在Assets目录下的Plugins文件夹中)
class Person
{
public string name;
public int age;
public string sex;
public Hashtable hobby;
}
using System.Collections;
using System.IO;
using System.Text;
using LitJson;
using UnityEditor;
using UnityEngine;
public class TestJson : MonoBehaviour
{
private string path;
Person person = new Person();
void Start()
{
path = Application.dataPath + "/json/myJson.json";
person.hobby = new Hashtable();
}
void Update()
{
if (Input.GetMouseButtonDown(0))//创建
{
//CreateJsonMethodOne();
CreateJsonMethodTwo();
//CreateJsonMethodThree();
// CreateJsonMethodFour();
}
if (Input.GetMouseButtonDown(1))//解析json
{
AnalyzeJson();
}
if (Input.GetKeyDown(KeyCode.D))//删除
{
Delete();
}
if (Input.GetKeyDown(KeyCode.X))//增加、修改
{
UpdateJson();
}
}
--------------------------创建Json文件有四种方式---------------------------------
********************* 使用JsonData *********************
private void CreateJsonMethodOne()
{
JsonData data = new JsonData();
data["name"] = "fcj";
data["sex"] = "女";
data["age"] = 23;
data["hobby"] = new JsonData();
data["hobby"]["morning"] = "sleep";
data["hobby"]["noon"] = "sleep";
data["hobby"]["evening"] = "sleep";
string str = data.ToJson();
StreamWriter sw;
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
fi.Delete();
}
sw = fi.CreateText();
sw.Write(str);
sw.Close();
AssetDatabase.Refresh();
}
********************* 使用JsonMapper *********************
private void CreateJsonMethodTwo()
{
person.name = "fcj";
person.age = 22;
person.sex = "女";
person.hobby.Add("morning", "sleep");
person.hobby.Add("noon", "sleep");
person.hobby.Add("evening", "sleep");
string str = JsonMapper.ToJson(person);
StreamWriter sw;
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
fi.Delete();
}
sw = fi.CreateText();
sw.Write(str);
sw.Close();
AssetDatabase.Refresh();
}
********************* 使用
JsonWriter ********************
private void CreateJsonMethodThree()
{
JsonWriter writer = new JsonWriter();
writer.WriteArrayStart();
writer.Write("one");
writer.Write("two");
writer.Write("three");
writer.Write("four");
writer.WriteArrayEnd();
string str = writer.ToString();
StreamWriter sw;
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
fi.Delete();
}
sw = fi.CreateText();
sw.Write(str);
sw.Close();
AssetDatabase.Refresh();
}
********************** 使用
JsonWriter *********************
private void CreateJsonMethodFour()
{
JsonWriter writer = new JsonWriter();
writer.WriteObjectStart();
writer.WritePropertyName("name");
writer.Write("fcj");
writer.WritePropertyName("age");
writer.Write(24);
writer.WritePropertyName("sex");
writer.Write("女");
writer.WriteObjectEnd();
string str = writer.ToString();
byte[] bytes = Encoding.Default.GetBytes(str);
StreamWriter sw;
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
fi.Delete();
}
sw = fi.CreateText();
sw.Write(Encoding.GetEncoding("GB2312").GetString(bytes));
sw.Close();
AssetDatabase.Refresh();
}
------------------------------删除Json文件---------------------------------
private void Delete()
{
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
fi.Delete();
}
AssetDatabase.Refresh();
}
--------------------------解析Json文件有三种发法-------------------------
Json文件:
{"name":"fcj","age":22,"sex":"女","hobby":{"evening":"sleep","noon":"sleep","morning":"sleep"}}
private void AnalyzeJson()
{
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
----------------获取字符串方法一----------------
StreamReader Stream_reader = fi.OpenText();
string str = Stream_reader.ReadToEnd();
-----------------获取字符串方法二---------------
FileStream fs = fi.OpenRead();
byte[] bytes = new byte[1024 * 1024 * 5];
int length = fs.Read(bytes, 0, bytes.Length);
string str = Encoding.UTF8.GetString(bytes, 0, length);
************************** 方法一 ************************
JsonReader Json_Reader=new JsonReader(str);
JsonData data = JsonMapper.ToObject(Json_Reader);
print(data["name"] + ":" + data["age"]);
************************** 方法二 ************************
JsonData data = JsonMapper.ToObject(str);
print(data["name"] + ":" + data["age"]);
IDictionary dic = data as IDictionary;
foreach (string VARIABLE in dic.Keys)
{
if (VARIABLE != "hobby")
print(VARIABLE + dic[VARIABLE]);
else
{
IDictionary hobby = data[VARIABLE] as IDictionary;
foreach (string item in hobby.Keys)
{
print(item + ":" + hobby[item]);
}
}
}
************************** 方法三 ************************
Person p = JsonMapper.ToObject(str);
print(p.name + ":" + p.age + ",hobby:" + p.hobby["morning"]);
Stream_reader.Close();
fs.Close();
}
}
-----------------------------更改Json文件-----------------------------
private void UpdateJson()
{
FileInfo fi = new FileInfo(path);
if (fi.Exists)
{
StreamReader Stream_reader = new StreamReader(path, Encoding.UTF8);//或fi.OpenText();
string str = Stream_reader.ReadToEnd();
Person p = JsonMapper.ToObject(str);
Stream_reader.Close();
fi.Delete();
StreamWriter sw = fi.CreateText();
Person newPerson = new Person();
newPerson.name = "newName";
newPerson.age = p.age;
newPerson.sex = p.sex;
newPerson.hobby = new Hashtable();
foreach (string VARIABLE in p.hobby.Keys)
{
newPerson.hobby.Add(VARIABLE,
p.hobby[VARIABLE].ToString());
}
newPerson.hobby.Add("afternoon", "eat");
string newStr = JsonMapper.ToJson(newPerson);
sw.Write(newStr);
sw.Close();
AssetDatabase.Refresh();
}
}
}
- p.hobby[VARIABLE]为JsonData类型,所以要toString(),否则会有异常;
- p.hobby要注意实例化,否则会报空指针异常;
- StreamWriter、StreamReader等文件处理类用完以后要记得Close()。