JackSon的ObjectNode和JsonNode

news/2024/12/5 5:41:52/

JackSon的ObjectNode和JsonNode

想要代替FastJson的JsonObect,需要用到ObjectNode和JsonNode

最核心的就是:

  • JsonNode是一个抽象类,不能实例化,它不能put新节点进去(节点就是jsonobject存储的一对kv)
  • ObjectNode是JsonNode的子类,可以进行put
关系:

JsonNode类是一个抽象类,它表示JSON格式数据的节点。JsonNode对象可以是一个JSON对象、数组、字符串、数字等等。JsonNode类中包含了许多操作JSON节点的方法,例如get()、path()、isValueNode()等等。

ObjectNode类是JsonNode的子类,它表示一个JSON对象节点。与JsonNode不同的是,ObjectNode对象只能包含JSON对象类型的子节点,而不能包含数组、字符串、数字等等。ObjectNode类中包含了JsonNode类中的所有方法,同时也添加了一些操作JSON对象的方法,例如put()、remove()等等。

为什么JsonNode没有put方法

JsonNode类是一个抽象类,它的实现类包括ObjectNode、ArrayNode、TextNode、NumericNode等。这些实现类都是不可变的,也就是说它们的值一旦被设置,就不能被修改。因此,JsonNode类没有提供类似put()方法这样的修改操作。

相比之下,ObjectNode类是JsonNode的一个实现类,它提供了一系列的put()方法来添加或修改子节点。ObjectNode是可变的,即可以修改已有的子节点,也可以添加新的子节点

JsonNode类之所以设计成不可变的,是为了保证JSON数据的稳定性和安全性。在多线程环境下,如果允许修改JsonNode对象的值,那么可能会引发线程安全问题。而将JsonNode对象设计成不可变的,则可以避免这些问题。

**虽然JsonNode对象本身是不可变的,但是可以通过ObjectMapper类来创建新的JsonNode对象。**例如,可以通过ObjectMapper的createObjectNode()方法创建一个新的ObjectNode对象,并使用put()方法添加新的子节点。需要注意的是,每次添加新的子节点时,都会创建一个新的JsonNode对象,因此在处理大量数据时需要注意效率问题。

ObjectNode和JsonNode两个区别,应该在什么情况下使用

JsonNode是不可变的,一旦创建后就不能修改其值或添加子节点;而ObjectNode是可变的,可以添加、修改、删除子节点。因此,如果需要对JSON数据进行修改操作,应该使用ObjectNode类;如果只需要读取JSON数据,可以使用JsonNode类

需要注意的是,由于ObjectNode是可变的,因此在多线程环境下需要进行同步操作,否则可能会引发线程安全问题。另外,ObjectNode类提供了许多便捷的方法来操作JSON对象,如put()、set()、replace()等,可以极大地简化JSON数据的处理过程。但是,在处理大量数据时,需要注意ObjectNode对象的创建和销毁,以及内存使用的问题。

总之,JsonNode和ObjectNode都是Jackson库中处理JSON数据的重要类,应该根据实际需要选择使用。如果只需要读取JSON数据,可以使用JsonNode类;如果需要对JSON数据进行修改操作,应该使用ObjectNode类。同时,需要注意线程安全、内存使用等问题,以确保程序的正确性和性能。


http://www.ppmy.cn/news/64415.html

相关文章

【团购-自定义Cell完善 Objective-C语言】

一、我们刚才这么写,有一个问题, 1.CZGoodsCell *cell = [[NSBundle mainBundle] loadNibNamed:@“CZGoodsCell” owner : nil options : nil ] ; 这样是不是没有进行单元格重用啊, 没有重用单元格, 我们说,前面还有一个对单元格进行重用吧, static NSString *ID = @“…

golang汇编之控制流(五)

程序执行的流程主要有顺序、分支和循环几种执行流程。本节主要讨论如何将Go语言的控制流比较直观地转译为汇编程序,或者说如何以汇编思维来编写Go语言代码。 顺序执行 顺序执行是我们比较熟悉的工作模式,类似俗称流水账编程。所有不含分支、循环和goto…

通过栈/队列/优先级队列/了解容器适配器,仿函数和反向迭代器

文章目录 一.stack二.queue三.deque(双端队列)四.优先级队列优先级队列中的仿函数手搓优先级队列 五.反向迭代器手搓反向迭代器 vector和list我们称为容器,而stack和queue却被称为容器适配器。 这和它们第二个模板参数有关系,可以…

csgo搬砖项目,时间自由,项目包下车,包落地

Steam是一款全球较大的综合性数字游戏软件发行平台。steam同时在线飙到3300万!超越你说熟悉的王者,吃鸡!用户多,竞争者少,连我自己都没想到,有一天我居然可以靠着steam游戏搬砖来赚钱养活自己。 实话实说&a…

【分布族谱】Zipf分布及其Python可视化

文章目录 zipf分布简介zipfian和zipf对象zipf分布到zeta分布的变化情况分布族谱图 zipf分布简介 #mermaid-svg-mG901pJXpTYFT7Bk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-mG901pJXpTYFT7Bk .error-icon{fill:…

一文带你搞清 ChatGPT 与 Azure OpenAI 的区别

这两周是我从2017年开始全职涉入 NLP 领域后最忙的两周,无数的同事和客户都在向我提出一个询问:ChatGPT 可以帮到我们什么? 特别是在2023年3月31日我做了一场微软 Azure OpenAI [布局助力企业]拥抱新智能时代的演讲之后,这几天我…

【大数据之Hadoop】二十七、生产调优-HDFS多目录

1 NameNode多目录配置 NameNode本地目录可以配置多个&#xff0c;每个目录存放内容相同&#xff0c;增加可靠性。 在hdfs-site.xml中添加&#xff0c;每台服务器节点的磁盘不同&#xff0c;可以选择不分发。 <property><name>dfs.namenode.name.dir</name>…

AssetBundle加载与卸载时的内存变化

AssetBundle.LoadFromFile加载一个80MB的assetbundle会分配1MB左右的pss内存 adb分析&#xff1a;private-otherUnityProfiler分析&#xff1a;有3块 1.Other/AssetBundle/LoadingCache 2.Other/SerializedFile/archive:/CAB-e42axxxxxxx 3.NotSaved/AssetBundle/xxxxxx.ab …