前言
今天要推薦的是 Newtonsoft.Json(也稱為 Json.NET),一款專為高效 JSON 數據處理而設計的強大插件,不僅性能卓越,還支持靈活的數據【序列化】與【反序列化】功能,非常適合 Unity 開發者在處理複雜數據結構、API 通信與本地儲存時使用!無論是【數據交換】、【配置管理】,還是遊戲【存檔】與【加載】,Newtonsoft.Json 都能提供靈活高效的解決方案,幫助開發者快速實現穩定的 JSON 操作。
本篇文章將結合基礎功能與實用範例,帶你深入了解如何【序列化物件】、【處理動態數據】,以及【應對嵌套結構】,並提供【詳細介紹】與【補充說明】,讓你全面掌握這款數據魔法師的精髓!如果你需要一款能顯著提升 JSON 處理效率的工具,千萬不要錯過 Newtonsoft.Json!
Unity Newtonsoft.Json 插件介紹
Newtonsoft.Json 是由 James Newton-King 開發的一款針對 JSON 數據處理的插件,這款插件以簡單直觀的操作和高性能數據處理能力著稱,幫助開發者快速完成數據的序列化與反序列化。無論是遊戲存檔、配置管理,還是動態數據的實時處理,Newtonsoft.Json 都是不可或缺的數據處理利器,且被廣泛應用於 .NET 和 Unity 專案中,成為 JSON 數據處理的事實標準。
功能特色
- 靈活的數據處理能力
支持多層級 JSON 結構的解析,提供完善的數據【序列化】與【反序列化】功能,並支持自定義設定,讓開發者能輕鬆適配不同需求。 - 高效性能表現
在處理大量數據時表現穩定且高效,針對 Unity 項目進行了性能優化,適合對【實時響應】和【穩定性】要求高的專案。 - 直觀 API 支援
提供清晰易用的 API 接口,讓開發者能快速學習與上手,縮短開發時間,提高工作效率。
適用場景
- 遊戲存檔與加載
在角色狀態保存、遊戲進度存檔中,快速【序列化】和【反序列化】複雜的遊戲數據結構。 - 動態數據處理
適用於即時更新的遊戲數據,例如【排行榜】、【在線數據交互】,確保數據處理高效穩定。 - 配置文件管理
用於配置文件的生成與解析,例如【遊戲設置】、【關卡參數】等,簡化配置過程並降低管理難度。
Unity Newtonsoft.Json 和 JsonUtility 對比
說到 JSON 處理庫,那就不得不提到 JsonUtility 了,在 Unity 中,處理 JSON 資料時常見的兩個選項是 Newtonsoft.Json 和 Unity 自帶的 JsonUtility。它們各有優缺點,適用於不同的使用情境。以下是它們的一些對比:
Newtonsoft.Json
優點
- 功能強大:
- 支援複雜的 JSON 化和反序列化設置,例如【日期格式】、【忽略空值等】。
- 支援 LINQ to JSON,可以方便地進行動態 JSON 操作。
- 靈活性高:
- 可以透過自訂【轉換器】和【屬性標記】來精確控制【序列化】和【反序列化】過程。
- 支援各種資料類型,包括【私有欄位】、【唯讀屬性】等。
- 廣泛使用和文件豐富:
- 是 .NET 生態系中廣泛使用的 JSON 函式庫,擁有大量的【教學課程】和【社群支援】。
- 是 .NET 生態系中廣泛使用的 JSON 函式庫,擁有大量的【教學課程】和【社群支援】。
缺點
- 性能較低:
- 相對於 JsonUtility,效能較低,特別是在行動平台上,因為它需要額外的【解析】和【反射操作】。
- 文件大小較大:
- 增加了項目的大小,因為需要引入第三方 DLL。
- 依賴性:
- 需要額外導入庫,增加了專案的【複雜度】和【依賴管理】。
- 需要額外導入庫,增加了專案的【複雜度】和【依賴管理】。
Unity's JsonUtility
優點
- 性能高:
- 由於是 Unity 原生提供的工具,優化了效能,特別是在行動平台上表現良好。
- 易於使用:
- API 簡單,對於基本的【序列化】和【反序列化】任務非常方便。
- 輕量級:
- 不需要額外的 DLL,減少了專案的【體積】和【複雜度】。
- 不需要額外的 DLL,減少了專案的【體積】和【複雜度】。
缺點
- 功能有限:
- 只支援簡單的 JSON 結構,不支援複雜的【巢狀物件】和【字典】。
- 不支援【私有欄位】和【唯讀屬性】,只能處理公用欄位。
- 靈活性低:
- 缺乏自訂選項,無法精細控制【序列化】和【反序列化】過程。
- 文件和社群支援較少:
- 相對於 Newtonsoft.Json,【文件】和【社群支援】較少,遇到問題時解決方案較少。
- 相對於 Newtonsoft.Json,【文件】和【社群支援】較少,遇到問題時解決方案較少。
Unity Newtonsoft.Json 總結
- Newtonsoft.Json:適用於需要處理複雜 JSON 結構或需要高度靈活性的場景,儘管會犧牲一些【效能】和增加【專案體積】。如果你需要支援包括【字典】、【私有欄位】以及自訂【序列化】行為,Newtonsoft.Json 是更好的選擇。
- JsonUtility:適用於簡單的【序列化】和【反序列化】需求,特別是在效能要求較高的環境下,如行動平台。如果你的 JSON 資料結構相對簡單,且你希望保持專案的輕量級和高效能,JsonUtility 是更好的選擇。
根據具體需求選擇合適的工具,可以最大限度地利用它們各自的優勢。
Unity Newtonsoft.Json 下載安裝
首先導入 Newtonsoft.Json 插件。
使用
以下是一些常用的用法:
1.序列化物件為 JSON 字串
using Newtonsoft.Json;
// 定義一個對象
public class Player
{
public string Name { get; set; }
public int Level { get; set; }
}
// 將對象序列化為JSON字符串
Player player = new Player { Name = "John", Level = 10 };
string json = JsonConvert.SerializeObject(player);
2.反序列化 JSON 字串為對象
// 從JSON字符串反序列化為對象
string json = "{\"Name\":\"John\",\"Level\":10}";
Player player = JsonConvert.DeserializeObject<Player>(json);
3.處理複雜結構的 JSON 資料
如果 JSON 資料包含巢狀的【物件】或【數組】,也可以輕鬆地進行【序列化】和【反序列化】操作。
4.處理 JSON 數組
// 序列化數組
List<Player> players = new List<Player>
{
new Player { Name = "Alice", Level = 15 },
new Player { Name = "Bob", Level = 20 }
};
string json = JsonConvert.SerializeObject(players);
// 反序列化數組
List<Player> deserializedPlayers = JsonConvert.DeserializeObject<List<Player>>(json);
5.自訂【序列化】/【反序列化】設定
可以透過 JsonSerializerSettings 參數自訂【序列化】和【反序列化】的行為,例如更改【日期格式】、【忽略空值】等。
儲存系統使用,儲存至本機資料處理
using System.IO;
using UnityEngine;
using System.Collections.Generic;
using Newtonsoft.Json;
public class DataManager
{
public static GameData gameData = new GameData();
public static string savePath = Path.Combine(Application.persistentDataPath,"saveData.json");
// 加密:選擇一些用於亦或操作的字符(注意保密)
public static char[] keyChars = { 'a', 'b', 'c', 'd', 'e' };
// 加密方法
public static string Encrypt(string data)
{
char[] dataChars = data.ToCharArray();
for (int i = 0; i < dataChars.Length; i++)
{
char dataChar = dataChars[i];
char keyChar = keyChars[i % keyChars.Length];
// 重點: 通過亦或得到新的字符
char newChar = (char)(dataChar ^ keyChar);
dataChars[i] = newChar;
}
return new string(dataChars);
}
// 解密方法
public static string Decrypt(string data)
{
return Encrypt(data);
}
//加載用戶數據
public static GameData Load()
{
// 檢查用戶配置文件是否存在
if (File.Exists(savePath))
{
// 從文本文件中加載JSON字符串
string jsonData = File.ReadAllText(savePath);
// #if UNITY_EDITOR
// // 加密5
// jsonData = Decrypt(jsonData);
// #endif
jsonData = Decrypt(jsonData);
// 將JSON字符串轉換為用戶內存數據
gameData = JsonConvert.DeserializeObject<GameData>(jsonData);
Debug.Log("加載成功");
return gameData;
}
else
{
Debug.Log("無數據");
return null;
}
}
// 保存用戶數據
public static void SaveUserData(UserData userData)
{
gameData.usersData[userData.name] = userData;
// 轉換用戶數據為JSON字符串
// string jsonData = JsonUtility.ToJson(gameData);
string jsonData = JsonConvert.SerializeObject(gameData);
// #if UNITY_EDITOR
// // 加密4
// jsonData = Encrypt(jsonData);
// #endif
jsonData = Encrypt(jsonData);
File.WriteAllText(savePath, jsonData);
Debug.Log("保存成功");
}
// 讀取用戶數據
public static UserData LoadUserData(string userName)
{
// 率先從緩存中取數據,而不是從文本文件中讀取
if (gameData.usersData.ContainsKey(userName))
{
return gameData.usersData[userName];
}
Load();
return gameData.usersData[userName]; ;
}
//刪除用戶
public static bool ClearUserData(string userName)
{
if (gameData.usersData.ContainsKey(userName))
{
gameData.usersData.Remove(userName);
}else{
Load();
gameData.usersData.Remove(userName);
}
string jsonData = JsonConvert.SerializeObject(gameData);
File.WriteAllText(savePath, jsonData);
return true;
}
// 保存當前用戶
public static void SaveClientData(ClientData data)
{
gameData.clientData = data;
// 轉換用戶數據為JSON字符串
string jsonData = JsonConvert.SerializeObject(gameData);
jsonData = Encrypt(jsonData);
File.WriteAllText(savePath, jsonData);
}
// 讀取當前用戶
public static ClientData LoadClientData()
{
if (gameData.clientData != null)
{
return gameData.clientData;
}
// 率先從緩存中取數據,而不是從文本文件中讀取
Load();
return gameData.clientData;
}
}
public class GameData
{
public Dictionary<string, UserData> usersData = new Dictionary<string, UserData>();
public ClientData clientData;
}
public class UserData
{
public string name;
public int level;
public UserData(string name, int level)
{
this.name = name;
this.level = level;
}
}
public class ClientData
{
public string curUserName = "";
public ClientData(string curUserName)
{
this.curUserName = curUserName;
}
}
Unity Newtonsoft.Json 相關介紹 & 教學影片
Unity Newtonsoft.Json 數據魔法師插件下載點
【Newtonsoft.Json】
————————————————
更多好用插件:【Unity 好用插件推薦】持續更新,一起讓遊戲開發事半功倍!
本文原創(或整理)於亞洲電玩通,未經作者與本站同意不得隨意引用、轉載、改編或截錄。
特約作家簡介
支持贊助 / DONATE
亞洲電玩通只是很小的力量,但仍希望為復甦台灣遊戲研發貢獻一點動能,如果您喜歡亞洲電玩通的文章,或是覺得它們對您有幫助,歡迎給予一些支持鼓勵,不論是按讚追蹤或是贊助,讓亞洲電玩通持續產出,感謝。
BTC |
352Bw8r46rfXv6jno8qt9Bc3xx6ptTcPze |
|
ETH |
0x795442E321a953363a442C76d39f3fbf9b6bC666 |
|
TRON |
TCNcVmin18LbnXfdWZsY5pzcFvYe1MoD6f |