ListJosn 反序列化
JsonMapper。ToObject("json字符串");
ListJosn 反序列化
JsonMapper。ToObject("json字符串");
ListJson 序列化与反序列化Json
JsonMapper.ToJson("数据对象");//序列化
JsonUtlity反序列化Json数据
JsonUtility.FormJson<数据类型>(Json字符串“)
如果Json中数据少了,读取到内存中类对象时不会报错
JsonUtlity序列化Json
JsonUtlity.ToJson(数据对象)//将对象中的数据转为Json字符串,数据对象中的自定义类需要加[Serializable]序列化特性,私有与保护的成员需要加[Serializefield]特性。Json不支持字典,序列化null会使用其默认值
Json基本语法
我们用什么来编辑Json文件?
只要能打开文档的软件都能打开Json文件
常用的一些编辑Json文件的方式
1.系统自带 记事本
2.通用文本编辑器——Sublime Text
3.网页上的Json编辑器。
创建Json文件:右键创建文本,改名为Json
注释方式:
和C#中的注释方式一致。
//
/* */
两种
语法规则:
符号的含义:
大括号{} —— 对象
中括号 —— 数组
冒号: —— 键值对对应关系
逗号, —— 数据分割
双引号“” —— 键名/字符串
键名只能是双引号,无法使用单引号。
J支持浮点数
#region总结
//1.必备知识点―File存读字符串的方法 ReadAllText和writeAllText//2.JsonUtlity提供的序列化反序列化方法ToJson和 FromJson
//3.自定义类需要加上序列化特性[System.Serializable]
//4.私有保护成员需要加上[SerializeField]
/ /5.3sonutlity不支持字典
//6.Jsonutlity不能直接将数据反序列化为数据集合1/7.son文档编码格式必须是UTF-8
#endregion
JsonUtlity和LitJson对比
(1)相同点:
都是用于Json的序列化和反序列化
Json文档编码格式必须时UTF-8
都是通过静态类进行方法调用
(2)不同点:
JsonUtility是Unity自带,LitJson是第三方需要引用命名空间
JsonUtility使用时自定义类需要添加特性,LitJson不需要
JsonUtility支持私有变量(加特性),LitJson不支持
JsonUtility不支持字典,LitJson支持(但是键只能是字符串)
JsonUtility不能直接将数据反序列化为数据结合(数组字典),LitJson可以
JsonUtility对自定义类不要求有无参构造,LitJson需要
JsonUtility存储对象时会存储默认值为不是null,LitJson会存null
方法:JsonMapper.ToObject(字符串)
jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/lesson2.json");
方法一:
// JsonData是LItJson提供的类对象,可以用键值对的形式访问其中的内容
JsonData data = JsonMapper.ToObject(jsonStr);
print(data["name"]);
print(data["age"]);
方法二:
Person p2 = JsonMapper.ToObject<Person>(jsonStr);
但其实现在方法二是会报错的
ArgumentException: The value '1' is not of type 'System.Int32' and cannot be used in this generic collection.
因为json文本中字典存储的键都是字符串的形式,与Person类中字典键的int不匹配
然后把Person类中的dic字典注释,继续会有另一个报错:
MissingMethodException: Default constructor not found for type Lesson2+Student
这是因为Student类中没有无参构造函数,在其中添加无参构造后就可以正常反序列化
注意:
类结构需要无参构造函数,否则反序列化报错字典虽然支持,但是键在使用为数值时会有问题,需要使用字符串类型
注意事项:
LitJson可以直接读取数据集合
还是以car为例:
jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/car.json");
Car[] arr = JsonMapper.ToObject<Car[]>(jsonStr);
List<Car> arr2 = JsonMapper.ToObject<List<Car>>(jsonStr);
这样是可以直接转化的
如果需要直接转字典,假设一个字典数据dic.json为:
{
"name": 1,
"name2": 2,
"name3": 3,
"name4": 4
}
注意!!!如果name4行最后有逗号,后面反序列化会出错
然后直接转为Dictionary:
jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/dic.json");
Dictionary<string, int> dic = JsonMapper.ToObject<Dictionary<string, int>>(jsonStr);
文本编码格式需要是UTF-8,不然无法加载
LitJson提供的序列化/反序列化方法:JsonMapper.ToJson和ToObject<>
LitJson不用加特性
LitJson不支持私有变量
LitJson支持字典序列化反序列化
LitJson可以直接将数据反序列化为数据集合
LitJson反序列化时,自定义类型需要无参构造
Json文档编码格式必须是UTF-8
6、LitJson 序列化
(1)LitJson是什么
第三方库,用于Json的序列化与反序列化,LitJson是C#编写,体积小、速度快、易于使用,它可以很容易地嵌入到代码中,只需要将LitJson代码拷贝到工程中即可
(2)获取LitJson
前往LitJson官网
通过官网前往Github获取最新版本代码
将src/LitJson的代码拷贝到Unity工程中,即可开始使用LItJson
(3)使用LitJson进行序列化
方法:JsonMapper.ToJson(对象)
注意:
相对JsonUtility不需要加特性
不能序列化私有变量
支持字典类型
需要引用LitJson命名空间
Li可以保存 null类型
使用和上面同样的例子,但是要把上面的对象、成员的特性移除(因为这些特性是针对JsonUtility的):
string jsonStr = JsonMapper.ToJson(p);
File.WriteAllText(Application.streamingAssetsPath + "/lesson2.json", jsonStr);
结果为:
{"name":"Well","age":19,"sex":true,"testF":1.3,"testD":1.3,"ids":[1,2,3,4],"ids2":[1,2,3,4],"dic":{"1":"123","2":"123"},"dic2":{"1":"123","2":"123"},"s1":null,"s2":[{"age":2,"name":"Ming"},{"age":3,"name":"Qiang"}]}
可以发现,字典能够存储(字典的键都是字符串),同时null能够表示,但是私有、保护变量无法存储,同时如果存储的有中文,表示方法与JsonUtility也不一样
(4)使用LitJson进行反序列化
(5)注意事项
6、JsonUtlity 反序列化
反序列化就是把硬盘上的数据读取到内存中,方法是通过API:JsonUtility.FromJson(字符串)
反序列化时是通过类的成员名与json文件中的键名进行匹配赋值
注意:如果Json中数据少了,读取到内存中类对象时不会报错
jsonStr = File.ReadAllText(Application.persistentDataPath + "/Person.json");
// 方法一:
Person p2 = JsonUtility.FromJson(jsonStr, typeof(Person)) as Person;
// 方法二:
Person p3 = JsonUtility.FromJson<Person>(jsonStr);
7、JsonUtility注意实想
(1)JsonUtility无法直接读取数据集合
例如一个json文件中是这样的:
[
{"id":1, "speed":6}
{"id":2, "speed":10}
]
然后对应的对象是:
class Car {
int id;
int speed;
}
那么是不能够将其直接反序列化到List<Car>中的,必须将List<Car>包裹在一个对象中,例如一个类中有一个List<Car> listCar成员,对Car加上[System.Serializable]特性,同样的,要将json文件用大括号包裹:
{
"listCar":[
{"id":1, "speed":6}
{"id":2, "speed":10}
]
}
(2)文本编码格式需要是UTF-8,不然无法加载
JsonUtlity 序列化
(1)、JsonUtility是什么
JsonUtility是Unity自带的用于解析Json的公共类,它可以:
i、将内存中对象序列化为Json格式的字符串
ii、将Json字符串反序列化为类对象
(2)在文件种存读字符串
i、存储字符串到指定路径文件中
// 参数一:存储路径
// 必须是存在的文件路径,如果没有对应文件夹,会报错
// 参数二:存储的字符串内容
File.WriteAllText(Application.persistentDataPath + "/Test.json", "测试存储的json文件");
// 如果Json文件夹不存在则会报错
// File.WriteAllText(Application.persistentDataPath + "/Json/Test.json", "测试存储的json文件");
ii、在指定路径文件中读取字符串
// 参数一:读取路径
// 参数二:编码格式(可选)
string str = File.ReadAllText(Application.persistentDataPath + "/Test.json");
(3)使用JsonUtility进行序列化
序列化就是把内存中的数据存储到硬盘上,方法是通过API:JsonUtility.ToJson(对象)
以以下类对象举例:
class Student {
public int age;
public string name;
public Student(int age, string name) {
this.age = age;
this.name = name;
}
}
class Person {
public string name;
public int age;
public bool sex;
public float testF;
public double testD;
public int[] ids;
public List<int> ids2;
public Dictionary<int, string> dic;
public Dictionary<string, string> dic2;
public Student s1;
public List<Student> s2;
private int privateI = 1;
protected int protectedI = 2;
}
然后对该数据类进行序列化
Person p = new Person();
p.name = "Well";
p.age = 19;
p.sex = true;
p.testF = 1.3f;
p.testD = 1.3;
p.ids = new int[] { 1, 2, 3, 4 };
p.ids2 = new List<int>() { 1, 2, 3, 4 };
p.dic = new Dictionary<int, string>() { { 1, "123" }, { 2, "123" } };
p.dic2 = new Dictionary<string, string>() { { "1", "123" }, { "2", "123" } };
p.s1 = new Student(1, "Hong");
p.s2 = new List<Student>() { new Student(2, "Ming"), new Student(3, "Qiang") };
// JsonUtility.ToJson()可以把类对象序列化为json字符串
string jsonStr = JsonUtility.ToJson(p);
File.WriteAllText(Application.streamingAssetsPath + "/Peoson.json", jsonStr);
序列化之后的Json文件存储的是:
{"name":"Well","age":19,"sex":true,"testF":1.2999999523162842,"testD":1.3,"ids":[1,2,3,4],"ids2":[1,2,3,4]}
可以发现,字典、Student、私有、保护数据没有存储
注意:
i、float序列化时会看来有一些误差,但读取的时候不会有影响
ii、自定义类需要加上序列化特性[System.Serializable],最外层的类不用添加
[System.Serializable]
class Student {
public int age;
public string name;
public Student(int age, string name) {
this.age = age;
this.name = name;
}
}
然后Json中内容是:
{"name":"Well","age":19,"sex":true,"testF":1.2999999523162842,"testD":1.3,"ids":[1,2,3,4],"ids2":[1,2,3,4],"s1":{"age":1,"name":"Hong"},"s2":[{"age":2,"name":"Ming"},{"age":3,"name":"Qiang"}]}
iii、想要序列化私有变量,需要加上特性[SerializeField]
[SerializeField] private int privateI = 1;
[SerializeField] protected int protectedI = 2;
结果为:
{"name":"Well","age":19,"sex":true,"testF":1.2999999523162842,"testD":1.3,"ids":[1,2,3,4],"ids2":[1,2,3,4],"s1":{"age":1,"name":"Hong"},"s2":[{"age":2,"name":"Ming"},{"age":3,"name":"Qiang"}],"privateI":1,"protectedI":2}
iv、JsonUtility不支持字典
v、JsonUtility存储null对象不会是null,而是默认的数据
例如:令s1=null,那么Json中存储的是:"s1":{"age":0,"name":""}
2、编辑Json文件的方式
(1)系统自带——记事本、写字板
(2)通用文本编辑器——Sublime Text等
(3)网页Json编辑器
我用的是vs code,可以直接编辑json文件
3、基础语法
注释和C#中注释方式一致
Json格式是一种键值对结构
语法规则:
符号含义:
大括号{} —— 对象
中括号[] —— 数组
冒号:—— 键值对对应关系
逗号,——数据分割
双引号“”——键名/字符串
键值对表示:“键名”:值内容
值类型:数字(整数或浮点)、字符串、true或false、数组、对象、null
字典的话,键会变成双引号字符串形式,转换时要注意!!!
当键为数字时,在Json中用字符串表示
“dic":{“1”:“123”,“key":123}
1、Json是什么
JavaScript对象简谱(JavaScript Object Notation)
json是国际通用的一种轻量级的数据交换格式,主要在网络通讯中用于传输数据,或本地数据存储和读取,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
游戏中可以把游戏数据按照Json的格式标准存储在Json文档中,再将Json文档存储在硬盘上或者传输给远端,达到数据持久化或者数据传输的目的
Json和Xml的异同:
共同点:都是纯文本,都有层级结构,都具有描述性
不同点:Json配置更简单,Json在某些情况下读写更快速
JsonMapper.ToObject(字符串); 返回JsonData
JsonData是LitJson提供的类对象,可以用键值对的形式去访问其中的内容,例如data["name"]
JsonMapper.ToObject<T>(字符串);
类结构需要无参构造函数,否则会报错
LitJson可以直接读取数据集合
文本的编码格式需要是UTF-8
获取LitJson
将代码拷贝到unity工程中,即src中的litjson文件夹
序列化:
JsonMapper.ToJson(对象);
私有变量不能序列化
可以保存null
JsonUtility.FromJson(字符串);
JsonUtility无法直接读取数据集合,需要包裹一层
本文编码格式必须是UTF-8
在文件中存读字符串
File.WriteAllText(存储的路径,字符串内容);
第一个参数必须是存在的文件路径,如果没有对应文件夹会报错
在指定路径文件中读取字符串
File.ReadAllText(路径); 返回string
序列化
JsonUtlity.ToJson(类对象); 返回string
float序列化时会有一些误差
自定义类需要加上序列化特性[System.Serializable]
私有变量序列化需要加上特性[SerializeField]
JsonUtility不支持字典
存储null对象,使用的是默认值,不是null
streamingAssetsPath 默认文件夹
persistentDataPath 读写文件夹
存储Json数据, 序列化
1.确认存储路径
2.序列化
3.讲序列化后结果写入到存储路径
读取指定文件中的Json文件,反序列化
1.确定从哪个路径获取
首先判断默认数据文件中是否有我们想要的数据,如果有,就从中获取
用File.Exists(Path)方法判断是否存在
2.读取路径中的json文件内容
3.反序列化
JsonUtlity和LitJson相同点
1.他们都是用于Json的序列化反序列化
2.Json文档编码都是UTF-8
3.都是通过静态类进行方法调用
JsonUtlity和LitJson的不同点
1.JsonUtlity是Unity自带的,LitJson是第三方,需要引用命名空间
2.JsonUtlity使用时需要加特性Serializable,LitJson不需要
3.JsonUtlity支持私有变量(需要加特性SerializableField),LitJson不支持
4.JsonUtlity不支持字典,LitJson支持(但是键只能是字符串)
5.JsonUtlity不能直接将数据反序列化为数据集合(数组字典),LitJson可以
6.JsonUtlity对自定义类不要求有无参构造函数,LitJson需要有无参构造函数
7.JsonUtlity存储空对象会存储默认值而不是Null,LitJson会存Null
使用LitJson 序列化
方法:JsonMapper.ToJson(对象)
注意:
1.相对JsonUtlity不需要加特性
2.不能序列化私有变量
3.支持字典,字典的键 建议都是字符串,因为Json的特点 Json的键会加双引号
4.需要引用Json.LitJson命名空间
5.LitJson可以准确保存null