REST Assured 45 - Fetch Value From Nested JSON Object Using JsonNode – Jackson – At() Method
作者:互联网
REST Assured 系列汇总 之 REST Assured 45 - Fetch Value From Nested JSON Object Using JsonNode – Jackson – At() Method
介绍
创建 POJO 类用来解析和获取一个 JSON 字符串中的值有时并不方便,特别针对那些非常长的,多层嵌套的 JSON。我们可以将 JSON 解析成树形结构更方便。
前提条件
因为我们用到 Jackson API, 所以确保导入 Jackson Databind 依赖包。
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.1</version>
</dependency>
嵌套的 JSON Object
JSON Object
{
"firstName": "Amod",
"lastName": "Mahajan",
"married": false,
"salary": 2000.54,
"addressPin": 45324,
"skill" :{
"Java" :"Intermediate",
"Selenium" :"Intermediate",
"Javascript" :"Beginner"
}
}
树形结构:
你可以用一个在线工具 来浏览上面的 JSON,呈现树型结构:
树形结构可能通过 path 方便定位到 node,这个 path 就像 HTML DOM 的 XPATH。
Deserialize 反序列化嵌套的 JSON Object
我们用到 Jackson API 的 ObjectMapper 类,该类提供的 “readTree()” 方法负责将 JSON 内容 deserialization 反序列化成树形形式的JsonNode 集合
我们通过 JsonNode 类的 get() 和 path() 方法来获取值,然后转换成适合的数据类型。
前一篇文章 Fetch Value From JSON Object Using JsonNode – Jackson – Get() & Path() Methods,针对的是一个简单的 JSON Object,字段是 1 对 1 的对应关系。本文是针对嵌套的 JSON Object, 一个键值包含的是另外一个 JSON Object。
我们可以用 get() 或 path() 方法来遍历一个嵌套的 JSON Object,如下:
// Using chaining of get() methods
String javaLevel = jsonTree.get("skills").get("Java").asText();
System.out.println(javaLevel);
// Using chaining of path() methods
String javaLevel2 = jsonTree.path("skills").path("Java").asText();
System.out.println(javaLevel2);
或许有更长的,嵌套更深的 JSON Object,我们也可以用 at() 方法来代替,接收一个 node 的 path,跟文件 path 类似。
// Using pattern expression with at()
String javaLevel3 = jsonTree.at("/skills/Java").asText();
System.out.println(javaLevel3);
如果没有匹配的 node 存在,at() 方法也不会返回 null,而是返回一个 node,但是这个 node 的方法 isMissingNode() 返回为 true.
代码:
import org.junit.Test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ParseNestedJsonObjectToReadValues {
@Test
public void parseJsonObjectToReadValues() throws JsonMappingException, JsonProcessingException
{
String jsonObject = "{\r\n" +
" \"firstName\": \"Amod\",\r\n" +
" \"lastName\": \"Mahajan\",\r\n" +
" \"married\": false,\r\n" +
" \"salary\": 2000.54,\r\n" +
" \"addressPin\": 45324,\r\n" +
" \"skills\" :{\r\n" +
" \"Java\" :\"Intermediate\",\r\n" +
" \"Selenium\" :\"Intermediate\",\r\n" +
" \"Javascript\" :\"Beginner\"\r\n" +
" }\r\n" +
"}";
// Creating an instance of ObjectMapper class
ObjectMapper objectMapper = new ObjectMapper();
// Get tree representation of json
JsonNode jsonTree = objectMapper.readTree(jsonObject);
// Using chaining of get() methods
String javaLevel = jsonTree.get("skills").get("Java").asText();
System.out.println(javaLevel);
// Using chaining of path() methods
String javaLevel2 = jsonTree.path("skills").path("Java").asText();
System.out.println(javaLevel2);
// Using pattern expression with at()
String javaLevel3 = jsonTree.at("/skills/Java").asText();
System.out.println(javaLevel3);
}
}
输出:
Intermediate
Intermediate
Intermediate
标签:JsonNode,Jackson,get,Object,Java,JSON,Using,path 来源: https://blog.csdn.net/wumingxiaoyao/article/details/120379122