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类。同时,需要注意线程安全、内存使用等问题,以确保程序的正确性和性能。