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

Guess you like

Origin blog.csdn.net/wumingxiaoyao/article/details/120379122