【推荐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

目录
相关文章
|
2天前
|
数据可视化 大数据 API
【推荐100个unity插件之22】基于UGUI的功能强大的简单易用的Unity数据可视化图表插件——XCharts3.0插件的使用
【推荐100个unity插件之22】基于UGUI的功能强大的简单易用的Unity数据可视化图表插件——XCharts3.0插件的使用
5 0
|
2天前
|
自然语言处理 搜索推荐 API
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
【推荐100个unity插件之21】unity实现多语言切换功能——Localization插件的使用
6 0
|
2天前
|
图形学
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
【推荐100个unity插件之19】武器拖尾特效插件——Pocket RPG Weapon Trails(2d 3d通用)
7 0
|
2天前
|
数据可视化 C# 图形学
【推荐100个unity插件之18】Unity 新版输入系统Input System的基础使用
【推荐100个unity插件之18】Unity 新版输入系统Input System的基础使用
8 0
|
2天前
|
图形学
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
【推荐100个unity插件之17】具有可破坏/砍倒unity地形树木能力的破坏系统,实现unity砍树效果 —— DestroyIt - Destruction System
6 0
|
2天前
|
vr&ar 图形学
【推荐100个unity插件之16】3D物品描边效果——Quick Outline免费插件
【推荐100个unity插件之16】3D物品描边效果——Quick Outline免费插件
2 0
|
2天前
|
存储 图形学
【推荐100个unity插件之13】推荐一款开源的Unity网格破碎插件,实现在Unity中展示可破坏的墙壁的——unity-fracture
【推荐100个unity插件之13】推荐一款开源的Unity网格破碎插件,实现在Unity中展示可破坏的墙壁的——unity-fracture
6 0
|
2天前
|
编解码 前端开发 Java
【推荐100个unity插件之12】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)
【推荐100个unity插件之12】UGUI的粒子效果(UI粒子)—— Particle Effect For UGUI (UI Particle)
7 0
|
2天前
|
开发工具 图形学
【推荐100个unity插件之11】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件
【推荐100个unity插件之11】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件
5 0
|
2天前
|
图形学
【推荐100个unity插件之9】分享几个完全免费的2D角色动画生成器(推荐收藏)
【推荐100个unity插件之9】分享几个完全免费的2D角色动画生成器(推荐收藏)
3 0