前言
Newtonsoft.Json(也称为Json.NET)是一个强大的JSON处理库,用于在.NET平台上进行JSON序列化和反序列化操作。它提供了一系列功能丰富的API,可以轻松地将.NET对象转换为JSON字符串,并将JSON字符串转换回.NET对象。
和JsonUtility对比
说到JSON处理库,那就不得不提到JsonUtility了,在Unity中,处理JSON数据时常见的两个选项是Newtonsoft.Json和Unity自带的JsonUtility。它们各有优缺点,适用于不同的使用场景。以下是它们的一些对比:
Newtonsoft.Json
优点
- 功能强大:
- 支持复杂的JSON结构,包括嵌套对象、数组和字典。
- 提供了丰富的序列化和反序列化设置,例如日期格式、忽略空值等。
- 支持LINQ to JSON,可以方便地进行动态JSON操作。
- 灵活性高:
- 可以通过自定义转换器和属性标记来精确控制序列化和反序列化过程。
- 支持各种数据类型,包括私有字段、只读属性等。
- 广泛使用和文档丰富:
- 是.NET生态系统中广泛使用的JSON库,拥有大量的教程和社区支持。
缺点
- 性能较低:
- 相对于JsonUtility,性能较低,特别是在移动平台上,因为它需要额外的解析和反射操作。
- 文件大小较大:
- 增加了项目的大小,因为需要引入第三方DLL。
- 依赖性:
- 需要额外导入库,增加了项目的复杂度和依赖管理。
Unity’s JsonUtility
优点
- 性能高:
- 由于是Unity原生提供的工具,优化了性能,特别是在移动平台上表现良好。
- 易于使用:
- API简单,对于基本的序列化和反序列化任务非常方便。
- 轻量级:
- 不需要额外的DLL,减少了项目的体积和复杂度。
缺点
- 功能有限:
- 只支持简单的JSON结构,不支持复杂的嵌套对象和字典。
- 不支持私有字段和只读属性,只能处理公共字段。
- 灵活性低:
- 缺乏自定义选项,无法精细控制序列化和反序列化过程。
- 文档和社区支持较少:
- 相对于Newtonsoft.Json,文档和社区支持较少,遇到问题时解决方案较少。
总结
- Newtonsoft.Json:适用于需要处理复杂JSON结构或需要高度灵活性的场景,尽管会牺牲一些性能和增加项目体积。如果你需要支持包括字典、私有字段以及自定义序列化行为,Newtonsoft.Json是更好的选择。
- JsonUtility:适用于简单的序列化和反序列化需求,特别是在性能要求较高的环境下,如移动平台。如果你的JSON数据结构相对简单,且你希望保持项目的轻量级和高性能,JsonUtility是更好的选择。
根据具体需求选择合适的工具,可以最大限度地利用它们各自的优势。
下载安装
使用
下面是一些常用的用法:
- 序列化对象为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);
- 反序列化JSON字符串为对象
// 从JSON字符串反序列化为对象 string json = "{\"Name\":\"John\",\"Level\":10}"; Player player = JsonConvert.DeserializeObject<Player>(json);
- 处理复杂结构的JSON数据
如果JSON数据包含嵌套的对象或数组,也可以轻松地进行序列化和反序列化操作。 - 处理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);
- 自定义序列化/反序列化设置
可以通过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; } }