赞
踩
目录
Json全名为“JavaScript Object Notation”,直接翻译过来就是“JavaScript 对象表示法”。
Json最初由道格拉斯·克罗克福德(Douglas Crockford)在2001年提出,并在RFC 4627中正式定义。它的设计之初是提供一种易于阅读和编写的数据交换格式,同时也易于机器解析和生成,用来作为XML的一种轻量级替代。
也就是说,Json并不属于一种编程语言,而是一种轻量级的数据交换格式。它的语法是基于JavaScript的,学习JavaScript的同学可以无缝使用,且由于语法的简单性,学习其他编程语言的同学也可以非常容易上手。
除了Json,我们知道还有XML、Protobuf、二进制等序列化方式,接下来我们就来进行一下平行对比
序列化文件大小 | 可读性 | 跨语言 | 跨平台 | 性能 | 易用性 | 适用场景 | |
---|---|---|---|---|---|---|---|
XML | 大 | 高,包含所有层级结构和信息 | 支持 | 支持 | 低 | 复杂,像Excel一样逐节点查询 | 配置文件、定义协议等 |
Json | 较小 | 较高,所有数据以键值对形式储存 | 支持 | 支持 | 较高 | 简单 | 轻量级的数据存储和网络传输通信 |
Protobuf | 小 | 低,不包含字段名等信息,且需要适用专门的工具进行反序列化 | 支持 | 支持 | 高 | 较复杂,需要自己定义Proto数据结构,但序列化反序列化过程简单 | 高性能,低带宽的网络传输通信 |
二进制 | 极小 | 低,全是0和1二进制字节 | 不支持 | 不支持 | 极高 | 简单 | 有加密需求的大规模网络传输通信,数据存储等 |
Newtonsoft.Json(Json.NET)是.Net生态中最流行,使用最广的JSON库。Unity中常用的其他JSON工具,如System.Json、LitJson还有Unity自带的Jsonutility,或多或少都存在一切缺陷,比如不支持复杂数据结构类型,移动端平台不支持等。
相比其他的JSON工具,Newtonsoft.Json支持绝大多数平台。有着最丰富的功能和API,不夸张的说,可以支持所有的数据结构类型,包括你自定义的数据结构类型,且序列化反序列化过程可定制。
与之相对的,Newtonsoft.Json的包体也会稍大,如果对包体的大小不追求极限的话,可以说Newtonsoft.Json就是你在Unity开发中使用Json的不二之选。
首先在你的Unity中建个脚本,using一下Newtonsoft.Json的命名空间,如果可以引用,表示你的Unity版本已经自带了Newtonsoft.Json,请直接跳到第三部分Newtonsoft.json的使用中,如果不行,请继续向下看
using Newtonsoft.Json;
网上很多教程都教你从Github下载.NET的Newtonsoft.Json,或者使用VS的Nuget包管理器进行安装,这些教程大家都可以在网上找到。
但是Newtonsoft.Json有着非常多的版本,支持不同的.NET环境和不同平台,且大部分都是不带AOT库的。你下载的库可能在Unity编译器和Windows下能正常使用,但是在移动端和主机端会遇到序列化失败的问题。
笔者这就教你一招取巧的方法,直接让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了
- 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);
- }
- }
建一个学生结构体,用来当测试的数据结构,包含学号,姓名,学习成绩三个成员字段
- 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序列化反序列时的自定义设置:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。