【推荐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 ,还做了一层优化,就是针对嵌套对象和属性的生成,使用方式呢,一年前的文章中有过详细的概述,这里呢也简单介绍一下。
466 4
鸿蒙开发:json转对象插件回来了
|
JSON JavaScript 数据格式
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能
jwt-auth插件实现了基于JWT(JSON Web Tokens)进行认证鉴权的功能
754 1
|
JSON 数据格式 微服务
.NET下 支持大小写不敏感的JSON Schema验证方法
有很多应用程序在验证JSON数据的时候用到了JSON Schema。 在微服务架构下,有时候各个微服务由于各种历史原因,它们所生成的数据对JSON Object属性名的大小写规则可能并不统一,它们需要消费的JSON数据的属性名可能需要大小写无关。 遗憾的是,目前的JSON Schema没有这方面的标准,标准中都是大小写敏感的。在类似上述情况下,这给使用JSON Schema进行数据验证造成了困难。
297 0
|
JSON Java 数据格式
IDEA插件-JSON转java类
IDEA插件-JSON转java类
947 0
|
Web App开发 JavaScript
使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件
使用CRXjs、Vite、Vue 开发 Chrome 多页面插件,手动配置 vite.config.ts 和 manifest.json 文件
1233 0
|
Web App开发 存储 JSON
Chrome插件开发(一)—manifest.json文件介绍
Chrome插件开发(一)—manifest.json文件介绍
681 0
|
机器学习/深度学习 人工智能 图形学
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
886 9
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
图形学 C#
超实用!深度解析Unity引擎,手把手教你从零开始构建精美的2D平面冒险游戏,涵盖资源导入、角色控制与动画、碰撞检测等核心技巧,打造沉浸式游戏体验完全指南
【8月更文挑战第31天】本文是 Unity 2D 游戏开发的全面指南,手把手教你从零开始构建精美的平面冒险游戏。首先,通过 Unity Hub 创建 2D 项目并导入游戏资源。接着,编写 `PlayerController` 脚本来实现角色移动,并添加动画以增强视觉效果。最后,通过 Collider 2D 组件实现碰撞检测等游戏机制。每一步均展示 Unity 在 2D 游戏开发中的强大功能。
1783 6
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
2057 6

热门文章

最新文章