创建 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
{ "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。
我们用到 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