REST Assured 27 - 用Jackson API的ObjectMapper类创建JSON Array

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。我们将通过下面方式去实现:

  1. 创建一个空的JSON Array
  2. 创建第一个JSON Object
  3. 创建第二个JSON Object
  4. 将两个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 : [ ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值