Unity 数据读取|(四)Json文件解析(Newtonsoft.Json ,Litjson,JsonUtility,SimpleJSON)_unity newtonsoft.json-程序员宅基地

技术标签: c#  unity  游戏引擎  # Unity数据读取  json  

1. 前言

  • JSON文件是一种纯文本文件,用于存储数据,并且是基于JavaScript的一个子集。JSON文件通常用于存储和传输数据,以及在应用程序之间交换信息。它们以键值对的形式存储数据,其中键是字符串,值可以是字符串、数字、布尔值、数组、对象或null。
  • JSON文件通常具有.json扩展名,例如example.json。在JSON文件中,数据以层次结构的形式组织,可以表示嵌套的对象和数组。JSON文件通常用于存储配置信息、数据交换和持久化存储。
  • 可以在https://www.json.org 了解关于JSON的更多信息。

2. 优缺点

  • JSON文件的优点包括:
    • 语法简单:JSON的语法非常简单,易于学习和使用,它基于JavaScript的一个子集,因此熟悉JavaScript的开发者可以很容易地使用JSON。
    • 数据结构清晰:JSON以键值对的形式存储数据,层次结构分明,使得数据的组织形式非常清晰,易于理解和处理。
    • 轻量级:JSON文件是纯文本文件,存储的数据量相对较小,比较轻量级,适合存储和传输大量数据。
    • 支持跨平台:JSON文件是跨平台的,可以在不同的操作系统和设备上使用,使得数据的共享和交换更加方便。
  • 然而,JSON文件也存在一些缺点:
    • 不支持注释:JSON文件不支持注释,这使得代码的维护和阅读变得困难。
    • 安全性问题:如果与不受信任的服务或不受信任的浏览器一起使用JSON,可能会存在安全漏洞,使得数据易受攻击。
    • 无法直接编辑:JSON文件是纯文本文件,无法像XML文件那样在文本编辑器中直接编辑,需要使用专门的工具或编程语言进行解析和编辑。
    • 无法存储函数或类:JSON只能存储数据,无法存储函数或类等复杂的数据结构,这限制了JSON的使用范围。

3. 解析

  • 格式模板
{  
  "name": "John",  
  "age": 30,  
  "married": true,  
  "address": {  
    "street": "123 Main St",  
    "city": "New York",  
    "state": "NY",  
    "postal_code": "10001"  
  },  
  "phone_numbers": [  
    "555-1234",  
    "555-5678"  
  ],  
  "career": null,  
  "hobbies": ["reading", "traveling"]  
}

3.1 Newtonsoft.Json

3.1.1 下载地址

3.1.2 优缺点

  • 优点:
    • 解析速度快:Newtonsoft.Json 的解析速度非常快,特别适合处理大量的 JSON 数据。
    • 支持多种数据格式:Newtonsoft.Json 可以解析多种数据格式的 JSON 数据,包括数组、对象、字符串、数字等等。
    • 可扩展性强:Newtonsoft.Json 提供了丰富的扩展接口和选项,方便开发者进行定制和扩展。
    • 可以解析复杂的Json,不需要和Json字段一对一
  • 缺点:
    • 无法使用 IL2CPP 方式打包:Newtonsoft.Json 不支持使用 IL2CPP 方式打包,这可能会限制其在某些特定环境下的适用性。
    • 解析报错:使用 Newtonsoft.Json 解析 JSON 数据时,如果 JSON 数据格式有误,可能会导致程序崩溃或者出现不可预测的行为。
    • 无法加密包体:Newtonsoft.Json 不支持对序列化后的数据进行加密,这可能会导致数据泄露或者被篡改。

3.1.3 解析

  • JsonConvert.DeserializeObject(json);将一个json字符串解析成一个类对象。
 Person person = JsonConvert.DeserializeObject<Person>(json);
  • JsonConvert.SerializeObject;将一个类对象转化成一个json字符串
string jsonStr = JsonConvert.SerializeObject(person);

3.2 listjson

3.2.1 下载地址

3.2.2 优缺点

  • listjson文件的优点包括:
    • 轻量级和高效:LitJson 的核心库非常小,没有任何外部依赖,因此它可以快速地被加载和使用。此外,LitJson 在解析和生成 JSON 数据时非常高效,可以处理大量的 JSON 数据而不会导致性能问题。
    • 支持多种数据类型:LitJson 支持常见的 JSON 数据类型,如字符串、数字、布尔值、数组和对象等。这使得它能够满足大多数 JSON 数据处理的需求。
    • 易于使用:LitJson 的 API 设计得非常简洁易用,使得开发者可以方便地进行 JSON 数据的序列化和反序列化操作。它提供了易于使用的函数和方法,以及对 JSON 数据的直观封装和操作。
    • 强大的序列化功能:LitJson 提供了强大的序列化功能,可以将 C# 对象序列化为 JSON 数据,并且支持将 JSON 数据反序列化为 C# 对象。这使得开发者可以轻松地将数据在 C# 对象和 JSON 数据之间进行转换。
  • 缺点:
    • 不支持自定义属性:虽然 LitJson 支持将大多数 C# 对象序列化为 JSON 数据,但它不支持将自定义属性序列化为 JSON。这意味着如果您的 C# 对象包含自定义属性,LitJson 可能无法正确地序列化这些属性。
    • JSON字符串中的key也需要和类字段的名字完全一致,如果不对应的话会解析失败。
    • 不支持跨平台:由于 Unity 的跨平台特性,LitJson 可能无法在所有平台上使用。这可能会限制其在某些特定环境下的适用性。
    • 可能存在内存泄漏:在使用 LitJson 的过程中,如果频繁地进行 JSON 数据的序列化和反序列化操作,可能会导致内存泄漏的情况。这主要是因为 Unity 的内存管理机制所致,但可以通过合理的内存管理和使用来解决这个问题。

3.2.3 解析

  • JsonMapper.ToObject(json):将一个json字符串解析成一个类对象
 Person person = JsonMapper.ToObject<Person>(str);
   // 解析json字符串 
  JsonData jsonData = JsonMapper.ToObject(jsonStr);  
   // 根据json的对象名来获取数据
   Debug.Log("name = " + (string)jsonData["name"]);  
  • JsonMapper.ToJson:将一个类对象转化成一个json字符串
 string jsonStr = JsonMapper.ToJson(persion);

3.3 JsonUtility

3.3.1 优缺点

  • 优点:
    • 高效:JsonUtility 序列化和反序列化 JSON 数据的速度非常快,特别适合处理大量的 JSON 数据。
    • 简单易用:JsonUtility 的 API 简洁易用,方便开发者进行 JSON 数据的序列化和反序列化操作。
    • 不依赖第三方库:JsonUtility 不依赖任何第三方库,可以独立使用。
  • 缺点:
    • 不支持自定义属性:JsonUtility 不支持将自定义属性序列化和反序列化为 JSON。这意味着如果您的 C# 对象包含自定义属性,JsonUtility 可能无法正确地序列化这些属性。
    • Json字符串的key需要和类字段的名字完全一样
    • 不支持跨平台:由于 Unity 的跨平台特性,JsonUtility 可能无法在所有平台上使用。这可能会限制其在某些特定环境下的适用性。
    • 对 List 和 Dictionary<TKey,TValue> 支持有限:JsonUtility 无法直接序列化和反序列化 List 和 Dictionary<TKey,TValue>,需要将它们包装到一个类中才能进行操作。

3.3.2 解析

  • JsonUtility.FromJson(json);将一个json字符串解析成一个类对象。
 Person person= JsonUtility.FromJson<Person>(json);
  • JsonUtility.ToJson;将一个类对象转化成一个json字符串。
string jsonStr= JsonUtility.ToJson(person);

3.4 SimpleJSON

3.4.1 下载地址

3.4.2 优缺点

  • 优点:
    • 体积小:SimpleJSON的源代码非常简洁,没有过多的类库和依赖,因此体积很小,可以快速地集成到项目中。
    • 速度快:SimpleJSON在解析和生成JSON时速度非常快,可以高效地处理大量的JSON数据。
    • 集成容易:SimpleJSON可以通过简单的几行代码就集成到项目中,无需过多的配置和设置。
    • 支持常用的JSON操作:SimpleJSON支持常用的JSON操作,例如序列化、反序列化、查询等。
  • 缺点:
    • 不支持复杂的JSON格式:SimpleJSON只支持简单的JSON格式,对于一些复杂的JSON格式可能会无法正确解析。
    • 无法直接将JSON对象转换为XML:SimpleJSON没有提供直接将JSON对象转换为XML的功能,需要手动进行转换。
    • 没有完整的文档:SimpleJSON没有提供完整的文档,使用时需要参考源代码和示例代码。

3.4.3 解析

  • JSON.Parse(string str);
JSONNode node = JSON.Parse(str);
var Nmae = node["Nmae"].Value;      
var age = node["age"].AsFloat;  
  • new JSONObject()和new JSONArray()
        JSONNode nodeRoot = new JSONObject();
        JSONNode node1 = new JSONArray();
        for (int i = 0; i < books.Count; i++)
        {
    
            JSONNode node0 = new JSONObject();
            node0.Add("Name", books[i].name);
            node1.Add(node0);
        }
        nodeRoot.Add("Preson", node1);

4. 总结

  • 解析时间:Newtonsoft.Json通常被认为是最快的JSON库之一,尤其是在处理大型JSON数据时表现出色。Litjson也具有较快的解析速度,但相对于Newtonsoft.Json可能稍慢一些。JsonUtility和SimpleJSON在解析时间方面可能不如前两者,尤其是在处理大型或复杂JSON数据时。
  • 内存占用:Newtonsoft.Json和Litjson通常会占用较多的内存,因为它们提供了丰富的功能和灵活性,但这也意味着它们可以处理更复杂的JSON数据。JsonUtility和SimpleJSON在内存占用方面可能更加轻量级,适合于对内存消耗有限制的场景。
  • 易用性:Newtonsoft.Json和Litjson提供了丰富的API和功能,使其易于使用和灵活处理各种JSON数据。JsonUtility在Unity引擎中内置,因此在Unity项目中使用非常方便。SimpleJSON也相对易于使用,尤其适合于处理简单的JSON数据。
  • 功能丰富度:Newtonsoft.Json和Litjson提供了丰富的功能,包括对JSON数据的序列化、反序列化、查询、操作等。JsonUtility在功能上相对较少,主要用于基本的JSON操作。SimpleJSON也提供了一些简单的JSON操作功能,但相对于Newtonsoft.Json和Litjson来说功能较为有限。
  • 总体而言,如果你不需要处理非常大型的 JSON 数据,SimpleJSON 和 LitJson 都是很好的选择。如果你需要处理更复杂的 JSON 数据,或者对性能有很高的要求,可以考虑使用 Newtonsoft.Json 或 JsonUtility。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/backlighting2015/article/details/134354169

智能推荐

linux里面ping www.baidu.com ping不通的问题_linux桥接ping不通baidu-程序员宅基地

文章浏览阅读3.2w次,点赞16次,收藏90次。对于这个问题我也是从网上找了很久,终于解决了这个问题。首先遇到这个问题,应该确认虚拟机能不能正常的上网,就需要ping 网关,如果能ping通说明能正常上网,不过首先要用命令route -n来查看自己的网关,如下图:第一行就是默认网关。现在用命令ping 192.168.1.1来看一下结果:然后可以看一下电脑上面百度的ip是多少可以在linux里面ping 这个IP,结果如下:..._linux桥接ping不通baidu

android 横幅弹出权限,有关 android studio notification 横幅弹出的功能没有反应-程序员宅基地

文章浏览阅读512次。小妹在这里已经卡了2-3天了,研究了很多人的文章,除了低版本api 17有成功外,其他的不是channel null 就是没反应 (channel null已解决)拜托各位大大,帮小妹一下,以下是我的程式跟 gradle, 我在这里卡好久又没有人可问(哭)![image](/img/bVcL0Qo)public class MainActivity extends AppCompatActivit..._android 权限申请弹窗 横屏

CNN中padding参数分类_cnn “相同填充”(same padding)-程序员宅基地

文章浏览阅读1.4k次,点赞4次,收藏6次。valid padding(有效填充):完全不使用填充。half/same padding(半填充/相同填充):保证输入和输出的feature map尺寸相同。full padding(全填充):在卷积操作过程中,每个像素在每个方向上被访问的次数相同。arbitrary padding(任意填充):人为设定填充。..._cnn “相同填充”(same padding)

Maven的基础知识,java技术栈-程序员宅基地

文章浏览阅读790次,点赞29次,收藏28次。手绘了下图所示的kafka知识大纲流程图(xmind文件不能上传,导出图片展现),但都可提供源文件给每位爱学习的朋友一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长![外链图片转存中…(img-Qpoc4gOu-1712656009273)][外链图片转存中…(img-bSWbNeGN-1712656009274)]

getFullYear()和getYear()有什么区别_getyear和getfullyear-程序员宅基地

文章浏览阅读469次。Date对象取得年份有getYear和getFullYear两种方法经 测试var d=new Date;alert(d.getYear())在IE中返回 2009,在Firefox中会返回109。经查询手册,getYear在Firefox下返回的是距1900年1月1日的年份,这是一个过时而不被推荐的方法。而alert(d.getFullYear())在IE和FF中都会返回2009。因此,无论何时都应使用getFullYear来替代getYear方法。例如:2016年用 getFullYea_getyear和getfullyear

Unix传奇 (上篇)_unix传奇pdf-程序员宅基地

文章浏览阅读182次。Unix传奇(上篇) 陈皓 了解过去,我们才能知其然,更知所以然。总结过去,我们才会知道我们明天该如何去规划,该如何去走。在时间的滚轮中,许许多的东西就像流星一样一闪而逝,而有些东西却能经受着时间的考验散发着经久的魅力,让人津津乐道,流传至今。要知道明天怎么去选择,怎么去做,不是盲目地跟从今天各种各样琳琅满目前沿技术,而应该是去 —— 认认真真地了解和回顾历史。 Unix是目前还在存活的操作系_unix传奇pdf

随便推点

ACwing 哈希算法入门:_ac算法 哈希-程序员宅基地

文章浏览阅读308次。哈希算法:将字符串映射为数字形式,十分巧妙,一般运用为进制数,进制据前人经验,一般为131,1331时重复率很低,由于字符串的数字和会很大,所以一般为了方便,一般定义为unsigned long long,爆掉时,即为对 2^64 取模,可以对于任意子序列的值进行映射为数字进而进行判断入门题目链接:AC代码:#include<bits/stdc++.h>using na..._ac算法 哈希

VS配置Qt和MySQL_在vs中 如何装qt5sqlmysql模块-程序员宅基地

文章浏览阅读952次,点赞13次,收藏27次。由于觉得Qt的编辑界面比较丑,所以想用vs2022的编辑器写Qt加MySQL的项目。_在vs中 如何装qt5sqlmysql模块

【渝粤题库】广东开放大学 互联网营销 形成性考核_画中画广告之所以能有较高的点击率,主要由于它具有以下特点-程序员宅基地

文章浏览阅读1k次。选择题题目:下面的哪个调研内容属于经济环境调研?()题目:()的目的就是加强与客户的沟通,它是是网络媒体也是网络营销的最重要特性。题目:4Ps策略中4P是指产品、价格、顾客和促销。题目:网络市场调研是目前最为先进的市场调研手段,没有任何的缺点或不足之处。题目:市场定位的基本参数有题目:市场需求调研可以掌握()等信息。题目:在开展企业网站建设时应做好以下哪几个工作。()题目:对企业网站首页的优化中,一定要注意下面哪几个方面的优化。()题目:()的主要作用是增进顾客关系,提供顾客服务,提升企业_画中画广告之所以能有较高的点击率,主要由于它具有以下特点

爬虫学习(1):urlopen库使用_urlopen the read operation timed out-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏5次。以爬取CSDN为例子:第一步:导入请求库第二步:打开请求网址第三步:打印源码import urllib.requestresponse=urllib.request.urlopen("https://www.csdn.net/?spm=1011.2124.3001.5359")print(response.read().decode('utf-8'))结果大概就是这个样子:好的,继续,看看打印的是什么类型的:import urllib.requestresponse=urllib.r_urlopen the read operation timed out

分享读取各大主流邮箱通讯录(联系人)、MSN好友列表的的功能【升级版(3.0)】-程序员宅基地

文章浏览阅读304次。修正sina.com/sina.cn邮箱获取不到联系人,并精简修改了其他邮箱代码,以下就是升级版版本的介绍:完整版本,整合了包括读取邮箱通讯录、MSN好友列表的的功能,目前读取邮箱通讯录支持如下邮箱:gmail(Y)、hotmail(Y)、 live(Y)、tom(Y)、yahoo(Y)(有点慢)、 sina(Y)、163(Y)、126(Y)、yeah(Y)、sohu(Y) 读取后可以发送邮件(完..._通讯录 应用读取 邮件 的相关

云计算及虚拟化教程_云计算与虚拟化技术 教改-程序员宅基地

文章浏览阅读213次。云计算及虚拟化教程学习云计算、虚拟化和计算机网络的基本概念。此视频教程共2.0小时,中英双语字幕,画质清晰无水印,源码附件全课程英文名:Cloud Computing and Virtualization An Introduction百度网盘地址:https://pan.baidu.com/s/1lrak60XOGEqMOI6lXYf6TQ?pwd=ns0j课程介绍:https://www.aihorizon.cn/72云计算:概念、定义、云类型和服务部署模型。虚拟化的概念使用 Type-2 Hyperv_云计算与虚拟化技术 教改