【Unity 插件推薦】Newtonsoft.Json 數據魔法師,解鎖高效 JSON 處理秘訣!

目錄
【Unity 插件推薦】Newtonsoft.Json 數據魔法師,解鎖高效 JSON 處理秘訣!

 

前言

 

今天要推薦的是 Newtonsoft.Json(也稱為 Json.NET),一款專為高效 JSON 數據處理而設計的強大插件,不僅性能卓越,還支持靈活的數據序列化反序列化功能,非常適合 Unity 開發者在處理複雜數據結構、API 通信與本地儲存時使用!無論是數據交換配置管理,還是遊戲存檔加載Newtonsoft.Json 都能提供靈活高效的解決方案,幫助開發者快速實現穩定的 JSON 操作。

 

本篇文章將結合基礎功能與實用範例,帶你深入了解如何序列化物件處理動態數據,以及應對嵌套結構,並提供【詳細介紹】與【補充說明】,讓你全面掌握這款數據魔法師的精髓!如果你需要一款能顯著提升 JSON 處理效率的工具,千萬不要錯過 Newtonsoft.Json

 

今天要推薦的是 Newtonsoft.Json,一款專為高效 JSON 數據處理而設計的強大插件,不僅性能卓越,還支持靈活的數據序列化與反序列化功能,非常適合 Unity 開發者在處理複雜數據結構、API 通信與本地儲存時使用!無論是【數據交換】、【配置管理】,還是【遊戲存檔與加載】,Newtonsoft.Json 都能提供靈活高效的解決方案,幫助開發者快速實現穩定的 JSON 操作。  本篇文章將結合基礎功能與實用範例,帶你深入了解如何【序列化物件】、【處理動態數據】,以及【應對嵌套結構】,並提供【實踐範例】與【使用技巧】,讓你全面掌握這款數據魔法師的精髓!如果你需要一款能顯著提升 JSON 處理效率的工具,千萬不要錯過 Newtonsoft.Json!

 

 

Unity Newtonsoft.Json 插件介紹

 

Newtonsoft.Json 是由 James Newton-King 開發的一款針對 JSON 數據處理的插件,這款插件以簡單直觀的操作和高性能數據處理能力著稱,幫助開發者快速完成數據的序列化與反序列化。無論是遊戲存檔、配置管理,還是動態數據的實時處理,Newtonsoft.Json 都是不可或缺的數據處理利器,且被廣泛應用於 .NETUnity 專案中,成為 JSON 數據處理的事實標準。

 

Newtonsoft.Json 示意圖

 

功能特色

  1. 靈活的數據處理能力
    支持多層級 JSON 結構的解析,提供完善的數據【序列化】與【反序列化】功能,並支持自定義設定,讓開發者能輕鬆適配不同需求。
  2. 高效性能表現
    在處理大量數據時表現穩定且高效,針對 Unity 項目進行了性能優化,適合對【實時響應】和【穩定性】要求高的專案。
  3. 直觀 API 支援
    提供清晰易用的 API 接口,讓開發者能快速學習與上手,縮短開發時間,提高工作效率。

 

適用場景

  1. 遊戲存檔與加載
    在角色狀態保存、遊戲進度存檔中,快速【序列化】和【反序列化】複雜的遊戲數據結構。
  2. 動態數據處理
    適用於即時更新的遊戲數據,例如【排行榜】、【在線數據交互】,確保數據處理高效穩定。
  3. 配置文件管理
    用於配置文件的生成與解析,例如【遊戲設置】、【關卡參數】等,簡化配置過程並降低管理難度。
【Unity 插件推薦】Newtonsoft.Json 數據魔法師,解鎖高效 JSON 處理秘訣!

 

 

Unity Newtonsoft.Json 和 JsonUtility 對比

 

說到 JSON 處理庫,那就不得不提到 JsonUtility 了,在 Unity 中,處理 JSON 資料時常見的兩個選項是 Newtonsoft.JsonUnity 自帶的 JsonUtility。它們各有優缺點,適用於不同的使用情境。以下是它們的一些對比:

 

Newtonsoft.Json

優點

  1. 功能強大:
    • 支援複雜的 JSON 化和反序列化設置,例如【日期格式】、【忽略空值等】。
    • 支援 LINQ to JSON,可以方便地進行動態 JSON 操作。
  2. 靈活性高:
    • 可以透過自訂【轉換器】和【屬性標記】來精確控制【序列化】和【反序列化】過程。
    • 支援各種資料類型,包括【私有欄位】、【唯讀屬性】等。
  3. 廣泛使用和文件豐富:
    • 是 .NET 生態系中廣泛使用的 JSON 函式庫,擁有大量的【教學課程】和【社群支援】。
       

缺點

  1. 性能較低:
    • 相對於 JsonUtility,效能較低,特別是在行動平台上,因為它需要額外的【解析】和【反射操作】。
  2. 文件大小較大:
    • 增加了項目的大小,因為需要引入第三方 DLL
  3. 依賴性:
    • 需要額外導入庫,增加了專案的【複雜度】和【依賴管理】。
       

Unity's JsonUtility

優點

  1. 性能高:
    • 由於是 Unity 原生提供的工具,優化了效能,特別是在行動平台上表現良好。
  2. 易於使用:
    • API 簡單,對於基本的【序列化】和【反序列化】任務非常方便。
  3. 輕量級:
    • 不需要額外的 DLL,減少了專案的【體積】和【複雜度】。
       

缺點

  1. 功能有限:
    • 只支援簡單的 JSON 結構,不支援複雜的【巢狀物件】和【字典】。
    • 不支援【私有欄位】和【唯讀屬性】,只能處理公用欄位。
  2. 靈活性低:
    • 缺乏自訂選項,無法精細控制【序列化】和【反序列化】過程。
  3. 文件和社群支援較少:
    • 相對於 Newtonsoft.Json【文件】和【社群支援】較少,遇到問題時解決方案較少。
       

 

Unity Newtonsoft.Json 總結

 

  • Newtonsoft.Json適用於需要處理複雜 JSON 結構或需要高度靈活性的場景,儘管會犧牲一些【效能】和增加【專案體積】。如果你需要支援包括【字典】、【私有欄位】以及自訂【序列化】行為,Newtonsoft.Json 是更好的選擇。
  • JsonUtility:適用於簡單的【序列化】和【反序列化】需求,特別是在效能要求較高的環境下,如行動平台。如果你的 JSON 資料結構相對簡單,且你希望保持專案的輕量級和高效能,JsonUtility 是更好的選擇。

根據具體需求選擇合適的工具,可以最大限度地利用它們各自的優勢。

 

 

Unity Newtonsoft.Json 下載安裝

 

首先導入 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】

官方網站:Newtonsoft.Json

GitHub 下載連結:Newtonsoft.Json

————————————————

以上內容改編節錄CSDN 作者:向宇it

 

更多好用插件:【Unity 好用插件推薦】持續更新,一起讓遊戲開發事半功倍!

 

 

 

本文原創(或整理)於亞洲電玩通,未經作者與本站同意不得隨意引用、轉載、改編或截錄。

特約作家簡介

X
A
Y
B
JamXu的頭像
JamXu
十年遊戲研發
二十年遊戲台主
三十年遊戲玩家

經中華網龍遊戲企劃進入遊戲圈,然後被雷打到去學程式前後端又學了點設計帶帶幾個研發團隊,見證了 3D 渲染技術及遊戲引擎互相進步,也見證了研發代理的更迭與博弈遊戲的興起,再毅然研究起 SEO 網路行銷社群廣告投放,深信自研自賣才是最大贏家,期望能為台灣研發重回輝煌時光貢獻一點力量。如果你也有遊戲夢,歡迎交流認識。


支持贊助 / DONATE

 

亞洲電玩通只是很小的力量,但仍希望為復甦台灣遊戲研發貢獻一點動能,如果您喜歡亞洲電玩通的文章,或是覺得它們對您有幫助,歡迎給予一些支持鼓勵,不論是按讚追蹤或是贊助,讓亞洲電玩通持續產出,感謝。

亞洲電玩通AsiaGameMaster - Steam 遊戲鑑賞家
亞洲電玩通AsiaGameMaster - FB 粉絲專頁
亞洲電玩通AsiaGameMaster - IG 粉絲專頁
亞洲電玩通AsiaGameMaster - Twitter
亞洲電玩通AsiaGameMaster - Yoytube 粉絲專頁
亞洲電玩通AsiaGameMaster - Tiktok

BTC

亞洲電玩通AsiaGameMaster - BTC 鏈贊助地址

352Bw8r46rfXv6jno8qt9Bc3xx6ptTcPze

 

ETH

亞洲電玩通AsiaGameMaster - ETH 鏈贊助地址

0x795442E321a953363a442C76d39f3fbf9b6bC666

 

TRON

亞洲電玩通AsiaGameMaster - TRON 鏈贊助地址

TCNcVmin18LbnXfdWZsY5pzcFvYe1MoD6f

延伸閱讀