目錄
1.介紹
1.1 什么是Json
1.2 Json和其他數(shù)據(jù)序列化方案對比
1.3 為什么選擇Newtonsoft.Json
2.安裝Newtonsoft.json
2.1 網(wǎng)上其他安裝方式
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中正式定義。它的設計之初是提供一種易于閱讀和編寫的數(shù)據(jù)交換格式,同時也易于機器解析和生成,用來作為XML的一種輕量級替代。
也就是說,Json并不屬于一種編程語言,而是一種輕量級的數(shù)據(jù)交換格式。它的語法是基于JavaScript的,學習JavaScript的同學可以無縫使用,且由于語法的簡單性,學習其他編程語言的同學也可以非常容易上手。
1.2 Json和其他數(shù)據(jù)序列化方案對比
除了Json,我們知道還有XML、Protobuf、二進制等序列化方式,接下來我們就來進行一下平行對比
序列化文件大小 | 可讀性 | 跨語言 | 跨平臺 | 性能 | 易用性 | 適用場景 | |
---|---|---|---|---|---|---|---|
XML | 大 | 高,包含所有層級結構和信息 | 支持 | 支持 | 低 | 復雜,像Excel一樣逐節(jié)點查詢 | 配置文件、定義協(xié)議等 |
Json | 較小 | 較高,所有數(shù)據(jù)以鍵值對形式儲存 | 支持 | 支持 | 較高 | 簡單 | 輕量級的數(shù)據(jù)存儲和網(wǎng)絡傳輸通信 |
Protobuf | 小 | 低,不包含字段名等信息,且需要適用專門的工具進行反序列化 | 支持 | 支持 | 高 | 較復雜,需要自己定義Proto數(shù)據(jù)結構,但序列化反序列化過程簡單 | 高性能,低帶寬的網(wǎng)絡傳輸通信 |
二進制 | 極小 | 低,全是0和1二進制字節(jié) | 不支持 | 不支持 | 極高 | 簡單 | 有加密需求的大規(guī)模網(wǎng)絡傳輸通信,數(shù)據(jù)存儲等 |
1.3 為什么選擇Newtonsoft.Json
Newtonsoft.Json(Json.NET)是.Net生態(tài)中最流行,使用最廣的JSON庫。Unity中常用的其他JSON工具,如System.Json、LitJson還有Unity自帶的Jsonutility,或多或少都存在一切缺陷,比如不支持復雜數(shù)據(jù)結構類型,移動端平臺不支持等。
相比其他的JSON工具,Newtonsoft.Json支持絕大多數(shù)平臺。有著最豐富的功能和API,不夸張的說,可以支持所有的數(shù)據(jù)結構類型,包括你自定義的數(shù)據(jù)結構類型,且序列化反序列化過程可定制。
與之相對的,Newtonsoft.Json的包體也會稍大,如果對包體的大小不追求極限的話,可以說Newtonsoft.Json就是你在Unity開發(fā)中使用Json的不二之選。
2.安裝Newtonsoft.json
首先在你的Unity中建個腳本,using一下Newtonsoft.Json的命名空間,如果可以引用,表示你的Unity版本已經(jīng)自帶了Newtonsoft.Json,請直接跳到第三部分Newtonsoft.json的使用中,如果不行,請繼續(xù)向下看
using Newtonsoft.Json;
2.1 網(wǎng)上其他安裝方式
網(wǎng)上很多教程都教你從Github下載.NET的Newtonsoft.Json,或者使用VS的Nuget包管理器進行安裝,這些教程大家都可以在網(wǎng)上找到。
但是Newtonsoft.Json有著非常多的版本,支持不同的.NET環(huán)境和不同平臺,且大部分都是不帶AOT庫的。你下載的庫可能在Unity編譯器和Windows下能正常使用,但是在移動端和主機端會遇到序列化失敗的問題。
筆者這就教你一招取巧的方法,直接讓Unity為我們下載好匹配的版本
2.2 Unity下載匹配的版本
找到你項目根路徑下的Packages目錄,Packages和你的Assets文件夾是同級的
打開manifest.json,找到com.unity.collab-proxy,可以看到現(xiàn)在的版本號是2.0.1
我們先去看一下剛才Packages目錄下的packages-lock.json,可以看到現(xiàn)在的版本是2.0.1,dependencies依賴項是空的
接下來我們返回manifest.json,將com.unity.collab-proxy的版本號修改為1.15.4,像這樣
返回Unity,就會彈出窗口重新生成packages了
這時候我們再看下packages-lock.json文件,可以看到版本號已經(jīng)變?yōu)?.15.4了,且依賴里面多了Newtonsoft.Json
去Library中看一下,可以看到已經(jīng)下載到包體了,且自帶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 進行測試
建一個學生結構體,用來當測試的數(shù)據(jù)結構,包含學號,姓名,學習成績?nèi)齻€成員字段
public struct Student
{
public int num;
public string name;
public Dictionary<string, int> scoreDic;
}
建一個測試類,我們新建個學生數(shù)據(jù)實例,就用大雄這小子舉個栗子吧,我們都知道大雄的成績不是很好哈~
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 },
{"數(shù)學",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["語文"]);
}
}
看一下輸出,可以看到序列化和反序列化都沒什么問題
簡單小結
怎么樣呢,用起來是不是很簡單,大家也可以自己用一些復雜數(shù)據(jù)結構試試。需要注意的是,默認情況下,數(shù)據(jù)中的非公共字段,如Private、Protected等訪問修飾符修飾的字段是不會被序列化的。
下一節(jié),我將教大家一些Newtonsoft.Json序列化反序列時的自定義設置:文章來源:http://www.zghlxwxcb.cn/news/detail-845671.html
Unity中Newtonsoft.Json的使用(二)文章來源地址http://www.zghlxwxcb.cn/news/detail-845671.html
到了這里,關于Unity中Newtonsoft.Json的使用(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!