目录
1.介绍
1.1 什么是Json
1.2 Json和其他数据序列化方案对比
1.3 为什么选择Newtonsoft.Json
2.安装Newtonsoft.json
2.1 网上其他安装方式
2.2 Unity下载匹配的版本
3.Newtonsoft.Json的使用
3.1 写一个Json工具类进行序列化和反序列化
3.2 进行测试
简单小结
1.介绍
1.1 什么是Json
Json全名为“JavaScript Object Notation”,直接翻译过来就是“JavaScript 对象表示法”。
Json最初由道格拉斯·克罗克福德(Douglas Crockford)在2001年提出,并在RFC 4627中正式定义。它的设计之初是提供一种易于阅读和编写的数据交换格式,同时也易于机器解析和生成,用来作为XML的一种轻量级替代。
也就是说,Json并不属于一种编程语言,而是一种轻量级的数据交换格式。它的语法是基于JavaScript的,学习JavaScript的同学可以无缝使用,且由于语法的简单性,学习其他编程语言的同学也可以非常容易上手。
1.2 Json和其他数据序列化方案对比
除了Json,我们知道还有XML、Protobuf、二进制等序列化方式,接下来我们就来进行一下平行对比
序列化文件大小 | 可读性 | 跨语言 | 跨平台 | 性能 | 易用性 | 适用场景 | |
---|---|---|---|---|---|---|---|
XML | 大 | 高,包含所有层级结构和信息 | 支持 | 支持 | 低 | 复杂,像Excel一样逐节点查询 | 配置文件、定义协议等 |
Json | 较小 | 较高,所有数据以键值对形式储存 | 支持 | 支持 | 较高 | 简单 | 轻量级的数据存储和网络传输通信 |
Protobuf | 小 | 低,不包含字段名等信息,且需要适用专门的工具进行反序列化 | 支持 | 支持 | 高 | 较复杂,需要自己定义Proto数据结构,但序列化反序列化过程简单 | 高性能,低带宽的网络传输通信 |
二进制 | 极小 | 低,全是0和1二进制字节 | 不支持 | 不支持 | 极高 | 简单 | 有加密需求的大规模网络传输通信,数据存储等 |
1.3 为什么选择Newtonsoft.Json
Newtonsoft.Json(Json.NET)是.Net生态中最流行,使用最广的JSON库。Unity中常用的其他JSON工具,如System.Json、LitJson还有Unity自带的Jsonutility,或多或少都存在一切缺陷,比如不支持复杂数据结构类型,移动端平台不支持等。
相比其他的JSON工具,Newtonsoft.Json支持绝大多数平台。有着最丰富的功能和API,不夸张的说,可以支持所有的数据结构类型,包括你自定义的数据结构类型,且序列化反序列化过程可定制。
与之相对的,Newtonsoft.Json的包体也会稍大,如果对包体的大小不追求极限的话,可以说Newtonsoft.Json就是你在Unity开发中使用Json的不二之选。
2.安装Newtonsoft.json
首先在你的Unity中建个脚本,using一下Newtonsoft.Json的命名空间,如果可以引用,表示你的Unity版本已经自带了Newtonsoft.Json,请直接跳到第三部分Newtonsoft.json的使用中,如果不行,请继续向下看
using Newtonsoft.Json;
2.1 网上其他安装方式
网上很多教程都教你从Github下载.NET的Newtonsoft.Json,或者使用VS的Nuget包管理器进行安装,这些教程大家都可以在网上找到。
但是Newtonsoft.Json有着非常多的版本,支持不同的.NET环境和不同平台,且大部分都是不带AOT库的。你下载的库可能在Unity编译器和Windows下能正常使用,但是在移动端和主机端会遇到序列化失败的问题。
笔者这就教你一招取巧的方法,直接让Unity为我们下载好匹配的版本
2.2 Unity下载匹配的版本
找到你项目根路径下的Packages目录,Packages和你的Assets文件夹是同级的
打开manifest.json,找到com.unity.collab-proxy,可以看到现在的版本号是2.0.1
我们先去看一下刚才Packages目录下的packages-lock.json,可以看到现在的版本是2.0.1,dependencies依赖项是空的
接下来我们返回manifest.json,将com.unity.collab-proxy的版本号修改为1.15.4,像这样
返回Unity,就会弹出窗口重新生成packages了
这时候我们再看下packages-lock.json文件,可以看到版本号已经变为1.15.4了,且依赖里面多了Newtonsoft.Json
去Library中看一下,可以看到已经下载到包体了,且自带AOT库,支持所有的平台
这时候我们就可以在Unity中使用Newtonsoft.Json了
3.Newtonsoft.Json的使用
3.1 写一个Json工具类进行序列化和反序列化
using Newtonsoft.Json; //记得引用命名空间
public class JsonMgr
{
public static string Serialize<T>(T t)
{
return JsonConvert.SerializeObject(t);
}
public static T DeSerialize <T>(string json)
{
return JsonConvert.DeserializeObject<T>(json);
}
}
3.2 进行测试
建一个学生结构体,用来当测试的数据结构,包含学号,姓名,学习成绩三个成员字段
public struct Student
{
public int num;
public string name;
public Dictionary<string, int> scoreDic;
}
建一个测试类,我们新建个学生数据实例,就用大雄这小子举个栗子吧,我们都知道大雄的成绩不是很好哈~
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JsonTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Student student = new Student()
{
num = 50,
name = "野比大雄",
scoreDic = new Dictionary<string, int>()
{
{"语文",10 },
{"数学",5 },
{"英语",8 },
},
};
string json = JsonMgr.Serialize(student);
Debug.Log(json);
Student newStudent = JsonMgr.DeSerialize<Student>(json);
Debug.Log(newStudent.num);
Debug.Log(newStudent.name);
Debug.Log(newStudent.scoreDic["语文"]);
}
}
看一下输出,可以看到序列化和反序列化都没什么问题
简单小结
怎么样呢,用起来是不是很简单,大家也可以自己用一些复杂数据结构试试。需要注意的是,默认情况下,数据中的非公共字段,如Private、Protected等访问修饰符修饰的字段是不会被序列化的。
下一节,我将教大家一些Newtonsoft.Json序列化反序列时的自定义设置:
Unity中Newtonsoft.Json的使用(二)