簡化 JsonNode 上的陣列操作,無需 Jackson 中的型別轉換
1. 概述
在 Java 中使用 JSON(JavaScript 物件表示法)通常涉及使用 Jackson 等函式庫,它提供了各種類別來表示此類數據,例如
JsonNodе, ObjectNode,
和
ArrayNode
。
在本教程中,我們將**
探索簡化
JsonNodе
上的陣列操作的不同方法,而無需將其明確轉換
ArrayNode
**
Java
中的 ArrayNode。當直接在程式碼中操作資料時,這是必要的。
2.理解
JsonNode
和
ArrayNode
JsonNode
是 Jackson 函式庫中的一個抽象類,表示 JSON 樹中的節點。它是所有節點的基類,能夠儲存不同類型的數據,包括物件、陣列、字串、數字、布林值和空值。
JsonNode
實例是不可變的,這意味著我們無法在它們上設定屬性。
ArrayNode
是一種特定類型的
JsonNode
,表示 JSON 陣列。它擴展了
JsonNode
的功能,包括使用陣列的方法,例如透過索引添加、刪除和存取元素。
3. 使用
JsonNode
的
get()
方法
透過使用
JsonNode
方法,我們可以將其轉換為
ArrayNode
,而無需明確轉換。當我們需要對 JSON 陣列中的每個元素執行特定操作或驗證時,此方法非常有用:
@Test
void givenJsonNode_whenUsingJsonNodeMethods_thenConvertToArrayNode() throws JsonProcessingException {
int count = 0;
String json = "{\"objects\": [\"One\", \"Two\", \"Three\"]}";
JsonNode arrayNode = new ObjectMapper().readTree(json).get("objects");
assertNotNull(arrayNode, "The 'objects' array should not be null");
assertTrue(arrayNode.isArray(), "The 'objects' should be an array");
if (arrayNode.isArray()) {
for (JsonNode objNode : arrayNode) {
assertNotNull(objNode, "Array element should not be null");
count++;
assertEquals(3, count, "The 'objects' array should have 3 elements");
這種方法還確保我們在嘗試迭代其元素之前正在使用數組結構,從而有助於防止與意外 JSON 結構相關的潛在運行時錯誤。
4. 使用createArrayNode()
在 Jackson 中,我們可以使用createObjectNode()
方法來建立 JSON 物件。類似地,我們可以使用ObjectMapper
類別的createArrayNode()
方法來建立一個JSON陣列。 createArrayNode()
方法將傳回ArrayNode
類別的參考:
@Test
void givenJsonNode_whenUsingCreateArrayNode_thenConvertToArrayNode() throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode originalJsonNode = objectMapper.readTree("{\"objects\": [\"One\", \"Two\", \"Three\"]}");
ArrayNode arrayNode = objectMapper.createArrayNode();
originalJsonNode.get("objects").elements().forEachRemaining(arrayNode::add);
assertEquals("[\"One\",\"Two\",\"Three\"]", arrayNode.toString());
當我們需要將 JSON 結構的特定部分轉換為ArrayNode
而無需明確轉換時,此方法非常有用。創建ArrayNode
明確地表明我們正在使用Array,
從而使程式碼更具可讀性和表現力。
5.使用StreamSuppport
類
StreamSupport
是一個實用程式類,它提供了用於在各種資料結構(包括集合、陣列和專用迭代器)上建立Stream
和Spliterator
的靜態方法。使用 ObjectMapper 將字串反序列化為JsonNode
物件ObjectMapper.
在這裡,我們從objects
陣列的Spliterator
建立一個Stream
,並將元素收集到 List **List<JsonNode>** :
@Test
void givenJsonNode_whenUsingStreamSupport_thenConvertToArrayNode() throws Exception {
String json = "{\"objects\": [\"One\", \"Two\", \"Three\"]}";
JsonNode obj = new ObjectMapper().readTree(json);
List<JsonNode> objects = StreamSupport
.stream(obj.get("objects").spliterator(), false)
.collect(Collectors.toList());
assertEquals(3, objects.size(), "The 'objects' list should contain 3 elements");
JsonNode firstObject = objects.get(0);
assertEquals("One", firstObject.asText(), "The first element should be One");
當我們想要利用 Java Streams 以簡潔而富有表現力的方式從 JSON 陣列中提取和處理元素時,這種方法非常有用。
6. 使用Iterator
Iterator
是我們遍歷集合的多種方法之一。在這種方法中,我們利用迭代器來遍歷給定 JSON 結構中objects
陣列的元素:
@Test
void givenJsonNode_whenUsingIterator_thenConvertToArrayNode() throws Exception {
String json = "{\"objects\": [\"One\", \"Two\", \"Three\"]}";
JsonNode datasets = new ObjectMapper().readTree(json);
Iterator<JsonNode> iterator = datasets.withArray("objects").elements();
int count = 0;
while (iterator.hasNext()) {
JsonNode dataset = iterator.next();
System.out.print(dataset.toString() + " ");
count++;
assertEquals(3, count, "The 'objects' list should contain 3 elements");