【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【推荐100个unity插件之20】一个强大的JSON处理库——Newtonsoft.Json(也称为Json.NET)

前言

Newtonsoft.Json(也称为Json.NET)是一个强大的JSON处理库,用于在.NET平台上进行JSON序列化和反序列化操作。它提供了一系列功能丰富的API,可以轻松地将.NET对象转换为JSON字符串,并将JSON字符串转换回.NET对象。

和JsonUtility对比

说到JSON处理库,那就不得不提到JsonUtility了,在Unity中,处理JSON数据时常见的两个选项是Newtonsoft.Json和Unity自带的JsonUtility。它们各有优缺点,适用于不同的使用场景。以下是它们的一些对比:

Newtonsoft.Json

优点
  1. 功能强大
  • 支持复杂的JSON结构,包括嵌套对象、数组和字典。
  • 提供了丰富的序列化和反序列化设置,例如日期格式、忽略空值等。
  • 支持LINQ to JSON,可以方便地进行动态JSON操作。
  1. 灵活性高
  • 可以通过自定义转换器和属性标记来精确控制序列化和反序列化过程。
  • 支持各种数据类型,包括私有字段、只读属性等。
  1. 广泛使用和文档丰富
  • 是.NET生态系统中广泛使用的JSON库,拥有大量的教程和社区支持。
缺点
  1. 性能较低
  • 相对于JsonUtility,性能较低,特别是在移动平台上,因为它需要额外的解析和反射操作。
  1. 文件大小较大
  • 增加了项目的大小,因为需要引入第三方DLL。
  1. 依赖性
  • 需要额外导入库,增加了项目的复杂度和依赖管理。

Unity’s JsonUtility

优点
  1. 性能高
  • 由于是Unity原生提供的工具,优化了性能,特别是在移动平台上表现良好。
  1. 易于使用
  • API简单,对于基本的序列化和反序列化任务非常方便。
  1. 轻量级
  • 不需要额外的DLL,减少了项目的体积和复杂度。
缺点
  1. 功能有限
  • 只支持简单的JSON结构,不支持复杂的嵌套对象和字典。
  • 不支持私有字段和只读属性,只能处理公共字段。
  1. 灵活性低
  • 缺乏自定义选项,无法精细控制序列化和反序列化过程。
  1. 文档和社区支持较少
  • 相对于Newtonsoft.Json,文档和社区支持较少,遇到问题时解决方案较少。

总结

  • Newtonsoft.Json:适用于需要处理复杂JSON结构或需要高度灵活性的场景,尽管会牺牲一些性能和增加项目体积。如果你需要支持包括字典、私有字段以及自定义序列化行为,Newtonsoft.Json是更好的选择。
  • JsonUtility:适用于简单的序列化和反序列化需求,特别是在性能要求较高的环境下,如移动平台。如果你的JSON数据结构相对简单,且你希望保持项目的轻量级和高性能,JsonUtility是更好的选择。

根据具体需求选择合适的工具,可以最大限度地利用它们各自的优势。

下载安装

使用

下面是一些常用的用法:

  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);
  1. 反序列化JSON字符串为对象
// 从JSON字符串反序列化为对象
string json = "{\"Name\":\"John\",\"Level\":10}";
Player player = JsonConvert.DeserializeObject<Player>(json);
  1. 处理复杂结构的JSON数据
    如果JSON数据包含嵌套的对象或数组,也可以轻松地进行序列化和反序列化操作。
  2. 处理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);
  1. 自定义序列化/反序列化设置
    可以通过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;
    }
}

github地址

https://github.com/JamesNK/Newtonsoft.Json/releases

目录
相关文章
|
16天前
|
C#
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
|
16天前
|
人工智能 自然语言处理 API
适用于 .NET 稳定的官方OpenAI库
适用于 .NET 稳定的官方OpenAI库
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
26 1
|
16天前
|
开发框架 安全 .NET
.NET使用Moq开源模拟库简化单元测试
.NET使用Moq开源模拟库简化单元测试~
|
2月前
|
JSON JavaScript Java
在Java中处理JSON数据:Jackson与Gson库比较
本文介绍了JSON数据交换格式及其在Java中的应用,重点探讨了两个强大的JSON处理库——Jackson和Gson。文章详细讲解了Jackson库的核心功能,包括数据绑定、流式API和树模型,并通过示例演示了如何使用Jackson进行JSON解析和生成。最后,作者分享了一些实用的代码片段和使用技巧,帮助读者更好地理解和应用这些工具。
104 0
在Java中处理JSON数据:Jackson与Gson库比较
|
2月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
5月前
|
人工智能 物联网 开发工具
.NET技术:多元语言、丰富库与跨平台能力引领软件开发新纪元。
`【7月更文挑战第4天】.NET技术:多元语言、丰富库与跨平台能力引领软件开发新纪元。从企业应用、云服务到游戏开发,其角色日益凸显。随着微软的持续创新与社区合作,未来.NET将在物联网、AI等领域拓宽应用,开发者应把握趋势,共创未来。`
44 0
|
2月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
64 8
|
2月前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。
|
2月前
|
开发者 Windows
.NET 开源扁平化、美观的 C/S 控件库
【10月更文挑战第23天】介绍了三款适用于 .NET 平台的开源扁平化、美观的 C/S 控件库:MaterialSkin 采用 Google Material Design 风格,适合现代感界面;Krypton Toolkit 提供丰富控件,界面易于定制;Fluent Ribbon Control Suite 模仿 Office 界面,适合复杂功能应用。每款控件库均附有示例代码及 GitHub 链接。

热门文章

最新文章