介紹Jackson JsonNode和ObjectNode
Jackson JsonNode類,完整路徑為com.fasterxml.jackson.databind.JsonNode,是Jackson的json樹模型(對象圖模型)。Jackson能讀JSON至JsonNode實例,寫JsonNode到JSON。本文不涉及json序列化或反序列化,主要介紹如何從頭構建JsonNode對象圖,之后你可以序列化為json。
1. JsonNode vs. ObjectNode
The Jackson JsonNode對象不可變,這意味着不能直接構建JsonNode實例的對象圖,但你可以創建JsonNode 的子類ObjectNode實例的對象圖。作為JsonNode 的子類,ObjectNode可以在任何使用了JsonNode之處使用。后面你會看到如何構建ObjectNode對象圖。
2. 操作JsonNode
2.1. 從json中讀JsonNode
為了使用Jackson讀json為JsonNode,需要創建Jackson ObjectMapper 實例。然后調用其readTree()方法,使用源json作為參數,請看示例:
String json = "{ \"f1\" : \"v1\" } ";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(json);
System.out.println(jsonNode.get("f1").asText());
1
2
3
4
5
6
7
實際項目中ObjectMapper不應每次都創建,比如從spring容器中注入。
2.2. 寫JsonNode至json
使用Jackson寫JsonNode至json,也需要ObjectMapper對象。調用writeValueAsString()方法,或其他適合你的寫方法(writeValue),請看示例:
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = readJsonIntoJsonNode();
String json = objectMapper.writeValueAsString(jsonNode);
1
2
3
4
5
readJsonIntoJsonNode()方法是我創建用於解析json字符串值JsonNode的方法,為了生成JsonNode去寫。該方法抽取內容在本例中不是重點,你僅需了解產生了一個JsonNode對象。重要的是調用了ObjectWriter的writeValueAsString()方法將JsonNode寫入JSON字符串。ObjectMapper提供了很多寫方法,用於不同目的寫操作,讀者可以查看相應文檔或源碼。
2.3. 獲取JsonNode 字段
和json對象一樣,JsonNode可以多個字段。假設我們解析下面json值JsonNode:
{
"field1" : "value1",
"field2" : 999
}
1
2
3
4
json有兩個字段,如果你用jsonNode表示上面json對象,則可以獲得其兩個字段:
JsonNode jsonNode = ... //parse above JSON into a JsonNode
JsonNode field1 = jsonNode.get("field1");
JsonNode field2 = jsonNode.get("field2");
1
2
3
4
注意,即使兩個字段是字符串類型,但get方法總是返回JsonNode類型表示字段。
2.4. 使用at方法獲取JsonNode字段
Jackson JsonNode有個特殊方法是at()方法。at方法可以在給定JsonNode作為根節點Json對象圖中訪問任何字段。
示例如下:
{
"identification" : {
"name" : "James",
"ssn: "ABC123552"
}
}
1
2
3
4
5
6
如果該json對應的JsonNode可以通過at方法訪問其name字段:
JsonNode nameNode = jsonNode.at("/identification/name");
1
注意at方法的參數:字符串"/identification/name",這是json路徑表達式。路徑表達式指定了完整的從JsonNode的根到要訪問字段的路徑,與文件系統的路徑很相似。但需要提醒的是必須以/開頭。
at方法返回要訪問的字段的JsonNode,如果沒有找到則返回null。為了獲得字段的實際值,需要調用其他方法進行轉換,下面部分開始講解。
2.5. 轉換JsonNode字段
Jackson JsonNode類提供一組方法可以轉換字段值至其他數據類型。如long、字符串等。請看示例:
String f2Str = jsonNode.get("f2").asText();
double f2Dbl = jsonNode.get("f2").asDouble();
int f2Int = jsonNode.get("f2").asInt();
long f2Lng = jsonNode.get("f2").asLong();
1
2
3
4
如果f2字段包含值為123456,則其有可能唄轉換為字符串,double,int,long類型。
3. 操作ObjectNode
前面提到,JsonNode是不可變的。為了創建JsonNode對象圖,你需要改變圖中的JsonNode實例,如設置屬性值和子JsonNode實例。因為其不可變性,不能直接進行操作,替代的是其子類ObjectNode,下面詳細進行說明。
3.1. 設置ObjectNode屬性
首先創建ObjectNode實例:
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode objectNode = objectMapper.createObjectNode();
1
2
3
為了設置ObjectNode對象屬性,需要調用set方法。傳入字段名和JsonNode作為參數。
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode parentNode = objectMapper.createObjectNode();
JsonNode childNode = readJsonIntoJsonNode();
parentNode.set("child1", childNode);
1
2
3
4
5
6
readJsonIntoJsonNode() 方法負責生產一些JsonNode對象,我們准備作為ObjectNode的子節點。
3.2. 設置ObjectNode屬性值為原始數據類型值
ObjectNode類也提供一組方法用於設置屬性值為原始數據類型。相對於轉換原始值為JsonNode再進行設置要簡單。請看示例:
objectNode.put("field1", "value1");
objectNode.put("field2", 123);
objectNode.put("field3", 999.999);
1
2
3
4. 總結
本文介紹了Jackson的JsonNode和ObjectNode兩個類,前者是不可變的,一般用於讀取。后者可變,一般用於創建Json對象圖。
————————————————
版權聲明:本文為CSDN博主「neweastsun」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/neweastsun/article/details/100669516