【推荐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操作。
  2. 灵活性高

    • 可以通过自定义转换器和属性标记来精确控制序列化和反序列化过程。
    • 支持各种数据类型,包括私有字段、只读属性等。
  3. 广泛使用和文档丰富

    • 是.NET生态系统中广泛使用的JSON库,拥有大量的教程和社区支持。
缺点
  1. 性能较低

    • 相对于JsonUtility,性能较低,特别是在移动平台上,因为它需要额外的解析和反射操作。
  2. 文件大小较大

    • 增加了项目的大小,因为需要引入第三方DLL。
  3. 依赖性

    • 需要额外导入库,增加了项目的复杂度和依赖管理。

Unity's JsonUtility

优点
  1. 性能高

    • 由于是Unity原生提供的工具,优化了性能,特别是在移动平台上表现良好。
  2. 易于使用

    • API简单,对于基本的序列化和反序列化任务非常方便。
  3. 轻量级

    • 不需要额外的DLL,减少了项目的体积和复杂度。
缺点
  1. 功能有限

    • 只支持简单的JSON结构,不支持复杂的嵌套对象和字典。
    • 不支持私有字段和只读属性,只能处理公共字段。
  2. 灵活性低

    • 缺乏自定义选项,无法精细控制序列化和反序列化过程。
  3. 文档和社区支持较少

    • 相对于Newtonsoft.Json,文档和社区支持较少,遇到问题时解决方案较少。

总结

  • Newtonsoft.Json:适用于需要处理复杂JSON结构或需要高度灵活性的场景,尽管会牺牲一些性能和增加项目体积。如果你需要支持包括字典、私有字段以及自定义序列化行为,Newtonsoft.Json是更好的选择。

  • JsonUtility:适用于简单的序列化和反序列化需求,特别是在性能要求较高的环境下,如移动平台。如果你的JSON数据结构相对简单,且你希望保持项目的轻量级和高性能,JsonUtility是更好的选择。

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

下载安装

使用

下面是一些常用的用法:

  1. 序列化对象为JSON字符串

    csharp 复制代码
    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字符串为对象

    csharp 复制代码
    // 从JSON字符串反序列化为对象
    string json = "{\"Name\":\"John\",\"Level\":10}";
    Player player = JsonConvert.DeserializeObject<Player>(json);
  3. 处理复杂结构的JSON数据

    如果JSON数据包含嵌套的对象或数组,也可以轻松地进行序列化和反序列化操作。

  4. 处理JSON数组

    csharp 复制代码
    // 序列化数组
    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参数自定义序列化和反序列化的行为,例如更改日期格式、忽略空值等。

存储系统使用,保存到本地数据处理

csharp 复制代码
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

推荐

欢迎关注《100个unity插件系列》专栏,不定期持续产出内容:推荐100个unity插件

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,以便我第一时间收到反馈,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关推荐
_oP_i1 小时前
HTTP 请求Media typetext/plain application/json text/json区别
网络协议·http·json
一只小灿灿1 小时前
VB.NET在 Excel 二次开发中的全面应用
.net·excel
码农君莫笑2 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
神码编程3 小时前
【Unity功能集】TextureShop纹理工坊(五)选区
unity·游戏引擎·shader·ps选区
fkdw5 小时前
C# Newtonsoft.Json 反序列化派生类数据丢失问题
c#·json
liyongqiangcc8 小时前
了解 ASP.NET Core 中的中间件
.net
m0_748251729 小时前
Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)
android·游戏·unity
benben0449 小时前
Unity3D仿星露谷物语开发7之事件创建动画
unity·游戏引擎
gantengsheng9 小时前
基于51单片机和OLED12864的小游戏《贪吃蛇》
单片机·嵌入式硬件·游戏·51单片机