REST Assured 系列汇总 之 REST Assured 27 - 用Jackson API的ObjectMapper类创建JSON Array
前面我们学习了用Jackson API的ObjectMapper类创建JSON Object,对ObjectMapper有个基本的认识,今天我们学习用ObjectMapper来创建JSON Array或ArrayNode。
让我们用一个熟悉的JSON Array payload开始今天的学习,我们将用ObjectMapper来创建这个payload
[
{
"firstname":"Jim",
"lastname":"Brown",
"totalprice":111,
"depositpaid":true,
"additionalneeds":"Breakfast",
"bookingdates":{
"checkin":"2021-07-01",
"checkout":"2021-07-01"
}
},
{
"firstname" : "Amod",
"lastname" : "Mahajan",
"totalprice" : 222,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2022-07-01",
"checkout" : "2022-07-01"
}
}
]
上面这个JSON payload是一个JSON 数组,有两个JSON Object。我们将通过下面方式去实现:
- 创建一个空的JSON Array
- 创建第一个JSON Object
- 创建第二个JSON Object
- 将两个JSON Object加入到JSON Array中
创建一个空的JSON Array
ObjectMapper 类的createObjectNode() 方法可以创建一个JSON Object,相似地,ObjectMapper 类的createArrayNode() 方法可以创建JSON Array,返回 ArrayNode 类的一个实例。
ObjectMapper objectMapper = new ObjectMapper();
// Create an array which will hold two JSON objects
ArrayNode parentArray = objectMapper.createArrayNode();
创建第一个JSON Object:
// Creating Node that maps to JSON Object structures in JSON content
ObjectNode firstBookingDetails = objectMapper.createObjectNode();
// It is similar to map put method. put method is overloaded to accept different types of data
// String as field value
firstBookingDetails.put("firstname", "Jim");
firstBookingDetails.put("lastname", "Brown");
// integer as field value
firstBookingDetails.put("totalprice", 111);
// boolean as field value
firstBookingDetails.put("depositpaid", true);
firstBookingDetails.put("additionalneeds", "Breakfast");
// Since requirement is to create a nested JSON Object
ObjectNode firstBookingDateDetails = objectMapper.createObjectNode();
firstBookingDateDetails.put("checkin", "2021-07-01");
firstBookingDateDetails.put("checkout", "2021-07-01");
// Since 2.4 , put(String fieldName, JsonNode value) is deprecated. So use either set(String fieldName, JsonNode value) or replace(String fieldName, JsonNode value)
firstBookingDetails.set("bookingdates", firstBookingDateDetails);
创建第二个JSON Object:
// Creating Node that maps to JSON Object structures in JSON content
ObjectNode secondBookingDetails = objectMapper.createObjectNode();
// It is similar to map put method. put method is overloaded to accept different types of data
// String as field value
secondBookingDetails.put("firstname", "Amod");
secondBookingDetails.put("lastname", "Mahajan");
// integer as field value
secondBookingDetails.put("totalprice", 222);
// boolean as field value
secondBookingDetails.put("depositpaid", true);
secondBookingDetails.put("additionalneeds", "Breakfast");
// Since requirement is to create a nested JSON Object
ObjectNode secondBookingDateDetails = objectMapper.createObjectNode();
secondBookingDateDetails.put("checkin", "2022-07-01");
secondBookingDateDetails.put("checkout", "2022-07-01");
// Since 2.4 , put(String fieldName, JsonNode value) is deprecated. So use either set(String fieldName, JsonNode value) or replace(String fieldName, JsonNode value)
secondBookingDetails.set("bookingdates", secondBookingDateDetails);
将创建的JSON Object加到JSON Array
ArrayNode类提供add() 方法实现将每次一个JSON Object加到array中。
parentArray.add(firstBookingDetails);
parentArray.add(secondBookingDetails);
如果想一次加多个Object Nodes到array中,我们可以用addAll() 方法。它接收一个 Collection<? extends JsonNode> 我们可以创建一个List(因为List继承自Collection),将所有的JSON Object加到List。
parentArray.addAll(Arrays.asList(firstBookingDetails,secondBookingDetails));
注意:
如果你加入重复的Object Node,也将被加入到array。
将JSON Array格式化成合适的格式
String jsonArrayAsString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parentArray);
System.out.println("Created Json Array is : ");
System.out.println(jsonArrayAsString);
上面这些,我们用Jackson API 成功创建了一个JSON Array,我们接着学习JSON Array相关的其它操作方法。
获取JSON Array中的JSON Object
因为JSON Array是可迭代的对象,我们可以用index获取一个JSON Object。
// To get json array element using index
JsonNode firstElement = parentArray.get(0);
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(firstElement));
获取JSON Array的大小
size() 方法可以用来获取JSON Array的大小
int sizeOfArray = parentArray.size();
System.out.println("Size of array is "+sizeOfArray);
遍历JSON Array
iterator() 方法可以用来遍历整个JSON Array
// To iterate JSON Array
Iterator<JsonNode> iteraor = parentArray.iterator();
System.out.println("Prining Json Node using iterator : ");
while(iteraor.hasNext())
{
JsonNode currentJsonNode = iteraor.next();
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(currentJsonNode));
}
删除JSON Array中的一个JSON Object
// To remove an element from array
parentArray.remove(0);
System.out.println("After removing first element from array : "+ objectMapper.writerWithDefaultPrettyPrinter().
清空JSON Array
// To empty JSON Array
parentArray.removeAll();
System.out.println("After removing all elements from array : "+ objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parentArray));
完整代码:
import java.util.Arrays;
import java.util.Iterator;
import com.fasterxml.jackson.core.JsonProcessingException;
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;
/*
* [
{
"firstname":"Jim",
"lastname":"Brown",
"totalprice":111,
"depositpaid":true,
"additionalneeds":"Breakfast",
"bookingdates":{
"checkin":"2021-07-01",
"checkout":"2021-07-01"
}
},
{
"firstname":"Amod",
"lastname":"Mahajan",
"totalprice":222,
"depositpaid":true,
"additionalneeds":"Lunch",
"bookingdates":{
"checkin":"2022-07-01",
"checkout":"2022-07-01"
}
}
]
*
*/
public class CreateJsonArrayUsingJacksonAPI {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
// Create an array which will hold two JSON objects
ArrayNode parentArray = objectMapper.createArrayNode();
// Creating Node that maps to JSON Object structures in JSON content
ObjectNode firstBookingDetails = objectMapper.createObjectNode();
// It is similar to map put method. put method is overloaded to accept different types of data
// String as field value
firstBookingDetails.put("firstname", "Jim");
firstBookingDetails.put("lastname", "Brown");
// integer as field value
firstBookingDetails.put("totalprice", 111);
// boolean as field value
firstBookingDetails.put("depositpaid", true);
firstBookingDetails.put("additionalneeds", "Breakfast");
// Since requirement is to create a nested JSON Object
ObjectNode firstBookingDateDetails = objectMapper.createObjectNode();
firstBookingDateDetails.put("checkin", "2021-07-01");
firstBookingDateDetails.put("checkout", "2021-07-01");
// Since 2.4 , put(String fieldName, JsonNode value) is deprecated. So use either set(String fieldName, JsonNode value) or replace(String fieldName, JsonNode value)
firstBookingDetails.set("bookingdates", firstBookingDateDetails);
// Creating Node that maps to JSON Object structures in JSON content
ObjectNode secondBookingDetails = objectMapper.createObjectNode();
// It is similar to map put method. put method is overloaded to accept different types of data
// String as field value
secondBookingDetails.put("firstname", "Amod");
secondBookingDetails.put("lastname", "Mahajan");
// integer as field value
secondBookingDetails.put("totalprice", 222);
// boolean as field value
secondBookingDetails.put("depositpaid", true);
secondBookingDetails.put("additionalneeds", "Breakfast");
// Since requirement is to create a nested JSON Object
ObjectNode secondBookingDateDetails = objectMapper.createObjectNode();
secondBookingDateDetails.put("checkin", "2022-07-01");
secondBookingDateDetails.put("checkout", "2022-07-01");
// Since 2.4 , put(String fieldName, JsonNode value) is deprecated. So use either set(String fieldName, JsonNode value) or replace(String fieldName, JsonNode value)
secondBookingDetails.set("bookingdates", secondBookingDateDetails);
parentArray.add(firstBookingDetails);
parentArray.add(secondBookingDetails);
// OR
parentArray.addAll(Arrays.asList(firstBookingDetails,secondBookingDetails));
String jsonArrayAsString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parentArray);
System.out.println("Created Json Array is : ");
System.out.println(jsonArrayAsString);
System.out.println("=======================================================================================");
// To get json array element using index
JsonNode firstElement = parentArray.get(0);
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(firstElement));
System.out.println("=======================================================================================");
// To get size of JSON array
int sizeOfArray = parentArray.size();
System.out.println("Size of array is "+sizeOfArray);
System.out.println("=======================================================================================");
// To iterate JSON Array
Iterator<JsonNode> iteraor = parentArray.iterator();
System.out.println("Prining Json Node using iterator : ");
while(iteraor.hasNext())
{
JsonNode currentJsonNode = iteraor.next();
System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(currentJsonNode));
}
System.out.println("=======================================================================================");
// To remove an element from array
parentArray.remove(0);
System.out.println("After removing first element from array : "+ objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parentArray));
System.out.println("=======================================================================================");
// To empty JSON Array
parentArray.removeAll();
System.out.println("After removing all elements from array : "+ objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(parentArray));
}
}
输出:
Created Json Array is :
[ {
"firstname" : "Jim",
"lastname" : "Brown",
"totalprice" : 111,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2021-07-01",
"checkout" : "2021-07-01"
}
}, {
"firstname" : "Amod",
"lastname" : "Mahajan",
"totalprice" : 222,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2022-07-01",
"checkout" : "2022-07-01"
}
}, {
"firstname" : "Jim",
"lastname" : "Brown",
"totalprice" : 111,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2021-07-01",
"checkout" : "2021-07-01"
}
}, {
"firstname" : "Amod",
"lastname" : "Mahajan",
"totalprice" : 222,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2022-07-01",
"checkout" : "2022-07-01"
}
} ]
=======================================================================================
{
"firstname" : "Jim",
"lastname" : "Brown",
"totalprice" : 111,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2021-07-01",
"checkout" : "2021-07-01"
}
}
=======================================================================================
Size of array is 4
=======================================================================================
Prining Json Node using iterator :
{
"firstname" : "Jim",
"lastname" : "Brown",
"totalprice" : 111,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2021-07-01",
"checkout" : "2021-07-01"
}
}
{
"firstname" : "Amod",
"lastname" : "Mahajan",
"totalprice" : 222,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2022-07-01",
"checkout" : "2022-07-01"
}
}
{
"firstname" : "Jim",
"lastname" : "Brown",
"totalprice" : 111,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2021-07-01",
"checkout" : "2021-07-01"
}
}
{
"firstname" : "Amod",
"lastname" : "Mahajan",
"totalprice" : 222,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2022-07-01",
"checkout" : "2022-07-01"
}
}
=======================================================================================
After removing first element from array : [ {
"firstname" : "Amod",
"lastname" : "Mahajan",
"totalprice" : 222,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2022-07-01",
"checkout" : "2022-07-01"
}
}, {
"firstname" : "Jim",
"lastname" : "Brown",
"totalprice" : 111,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2021-07-01",
"checkout" : "2021-07-01"
}
}, {
"firstname" : "Amod",
"lastname" : "Mahajan",
"totalprice" : 222,
"depositpaid" : true,
"additionalneeds" : "Breakfast",
"bookingdates" : {
"checkin" : "2022-07-01",
"checkout" : "2022-07-01"
}
} ]
=======================================================================================
After removing all elements from array : [ ]