创建 POJO 类用来解析和获取一个 JSON 字符串中的值有时并不方便,特别针对那些非常长的,多层嵌套的 JSON。我们可以将 JSON 解析成树形结构更方便。
前面我们已经解析过一个简单的 和 嵌套的 JSON Object 成 JsonNode,参考如下:
Fetch Value From JSON Object Using JsonNode – Jackson – Get() & Path() Methods
Fetch Value From Nested JSON Object Using JsonNode – Jackson – At() Method
因为我们用到 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 Example
树形结构表示 JSON Array
你可以用一个在线工具 来浏览上面的 JSON,呈现树型结构:
一个 JSON Array 可能是 JSON Objects 的集合 或 JSON arrays,如下:
[ [ { "firstName": "Amod", "lastName": "Mahajan", "age": 28, "isMarried": false, "salary": 23456.54 }, { "firstName": "Rahul", "lastName": "Arora", "age": 32, "isMarried": true, "salary": 33456.54 } ], [ { "firstName": "Amod", "lastName": "Mahajan", "age": 28, "isMarried": false, "salary": 23456.54 }, { "firstName": "Rahul", "lastName": "Arora", "age": 32, "isMarried": true, "salary": 33456.54 } ] ]
我们用到 Jackson API 的 ObjectMapper 类,该类提供的 “readTree()” 方法负责将 JSON 内容 deserialization 反序列化成树形形式的JsonNode 集合
我们通过 JsonNode 类的 get() 和 path() 方法来获取值,然后转换成适合的数据类型。
我们只需用一个 index 来获取一个数组的元素,这也是基于数组的概念。
// Creating an instance of ObjectMapper class ObjectMapper objectMapper = new ObjectMapper(); // Get tree representation of json JsonNode jsonTree = objectMapper.readTree(jsonArray); // Get first json object and storing JsonNode firstJsonObject = jsonTree.get(0); // Get second json object and storing JsonNode secondJsonObject = jsonTree.get(1);
如果你不确定解析的 JSON 是一个 JSON Object 或 JSON tree,你可以用 instanceof,如下:
// To know if tree is a JSON object or JSON array System.out.println("Is parsed JSOn tree a JSON Object?"+ Boolean.toString(jsonTree instanceof ObjectNode)); System.out.println("Is parsed JSOn tree a JSON Array?"+ Boolean.toString(jsonTree instanceof ArrayNode));
注意 JsonNode 类是 ObjectNode 和 ArrayNode的父类。
如果你确定 JSON 就是一个 Object 或 Array,就可以直接装箱 case 成该类型。
ArrayNode jsonTree = (ArrayNode) objectMapper.readTree(jsonArray);
代码:
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; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; public class ParseJsonArrayToReadValues { @Test public void parseJsonArrayToReadValues() throws JsonMappingException, JsonProcessingException { String jsonArray = "[\r\n" + " {\r\n" + " \"firstName\": \"Amod\",\r\n" + " \"lastName\": \"Mahajan\",\r\n" + " \"age\": 28,\r\n" + " \"isMarried\": false,\r\n" + " \"salary\": 23456.54\r\n" + " },\r\n" + " {\r\n" + " \"firstName\": \"Rahul\",\r\n" + " \"lastName\": \"Arora\",\r\n" + " \"age\": 32,\r\n" + " \"isMarried\": true,\r\n" + " \"salary\": 33456.54\r\n" + " }\r\n" + "]"; // Creating an instance of ObjectMapper class ObjectMapper objectMapper = new ObjectMapper(); // Get tree representation of json JsonNode jsonTree = objectMapper.readTree(jsonArray); // To know if tree is a JSON object or JSON array System.out.println("Is parsed JSOn tree a JSON Object?"+ Boolean.toString(jsonTree instanceof ObjectNode)); System.out.println("Is parsed JSOn tree a JSON Array?"+ Boolean.toString(jsonTree instanceof ArrayNode)); // Get first json object and storing JsonNode firstJsonObject = jsonTree.get(0); // Get second json object and storing JsonNode secondJsonObject = jsonTree.get(1); // Get value of firstName as string String firstName = firstJsonObject.get("firstName").asText(); String lastName = firstJsonObject.get("lastName").asText(); // Get value of married as boolean int age = firstJsonObject.get("age").asInt(); boolean married = firstJsonObject.get("isMarried").asBoolean(); double salary = firstJsonObject.get("salary").asLong(); System.out.println("FirstName is : "+firstName); System.out.println("LastName is : "+lastName); System.out.println("Age is : "+age); System.out.println("Maritial status is : "+married); System.out.println("Salary is: "+salary); // Get value of firstName as string firstName = secondJsonObject.get("firstName").asText(); lastName = secondJsonObject.get("lastName").asText(); // Get value of married as boolean age = secondJsonObject.get("age").asInt(); married = secondJsonObject.get("isMarried").asBoolean(); salary = secondJsonObject.get("salary").asLong(); System.out.println("FirstName is : "+firstName); System.out.println("LastName is : "+lastName); System.out.println("Age is : "+age); System.out.println("Maritial status is : "+married); System.out.println("Salary is: "+salary); } }
输出:
Is parsed JSOn tree a JSON Object?false Is parsed JSOn tree a JSON Array?true FirstName is : Amod LastName is : Mahajan Age is : 28 Maritial status is : false Salary is: 23456.0 FirstName is : Rahul LastName is : Arora Age is : 32 Maritial status is : true Salary is: 33456.0