默认计划
2327人加入学习
(5人评价)
【唐老狮】Unity数据持久化之Json
价格 ¥ 149.00
承诺服务
该课程属于 Unity3d实战就业路线课程套餐
请加入后再学习

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在某些情况下读写更快速

[展开全文]
zhaowl · 2022-06-08 · Json概述 0

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

[展开全文]

授课教师

游戏开发前端主程

课程特色

视频(17)
下载资料(16)

学员动态

icytail 加入学习
猫小叔 加入学习
Astra 加入学习
839e4b8522eb9e66 加入学习