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

简介: 【推荐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

目录
相关文章
|
JSON IDE Java
鸿蒙开发:json转对象插件回来了
首先,我重新编译了插件,进行了上传,大家可以下载最新的安装包进行体验了,还是和以前一样,提供了在线版和IDE插件版,两个选择,最新的版本,除了升级了版本,兼容了最新的DevEco Studio ,还做了一层优化,就是针对嵌套对象和属性的生成,使用方式呢,一年前的文章中有过详细的概述,这里呢也简单介绍一下。
415 4
鸿蒙开发:json转对象插件回来了
|
传感器 开发工具 vr&ar
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
469 0
|
前端开发 JavaScript C#
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
570 0
|
图形学 C++ C#
Unity插件开发全攻略:从零起步教你用C++扩展游戏功能,解锁Unity新玩法的详细步骤与实战技巧大公开
【8月更文挑战第31天】Unity 是一款功能强大的游戏开发引擎,支持多平台发布并拥有丰富的插件生态系统。本文介绍 Unity 插件开发基础,帮助读者从零开始编写自定义插件以扩展其功能。插件通常用 C++ 编写,通过 Mono C# 运行时调用,需在不同平台上编译。文中详细讲解了开发环境搭建、简单插件编写及在 Unity 中调用的方法,包括创建 C# 封装脚本和处理跨平台问题,助力开发者提升游戏开发效率。
1999 0
|
数据可视化 大数据 API
【推荐100个unity插件之22】基于UGUI的功能强大的简单易用的Unity数据可视化图表插件——XCharts3.0插件的使用
【推荐100个unity插件之22】基于UGUI的功能强大的简单易用的Unity数据可视化图表插件——XCharts3.0插件的使用
1851 0
|
自然语言处理 搜索推荐 API
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
1924 0
|
图形学
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
896 0
|
数据可视化 C# 图形学
【推荐100个unity插件之18】Unity 新版输入系统Input System的基础使用
【推荐100个unity插件之18】Unity 新版输入系统Input System的基础使用
1859 0
|
10月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析: