目录

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的使用(二)

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐