Search code examples
rest-assuredrest-assured-jsonpath

convert complex json array to pojo java class


Below is the Expected JSON

 {
      "checkIn": "2023-06-03",
      "checkOut": "2023-06-04",
      "roomsInfo": [
        {
          "adultsCount": 2,
          "kidsAges": []
        }
      ],
      "searchInfo": null,
      "crossSellDetail": null,
      "query": "Chalets%2B"
    }

First POJO- RoomsInfo

import java.util.List;
import javax.annotation.processing.Generated;

@Generated("jsonschema2pojo")
public class RoomsInfo {
private int adultsCount;
private List<Integer> kidsAges;

/**
 * No args constructor for use in serialization
 *
 */
public RoomsInfo() {
}

/**
 *
 * @param adultsCount
 * @param list
 */
public RoomsInfo(int adultsCount, List<Integer> list) {
    super();
    this.adultsCount = adultsCount;
    this.kidsAges = list;
}

public int getAdultsCount() {
    return adultsCount;
}

public void setAdultsCount(int adultsCount) {
    this.adultsCount = adultsCount;
}

public List<Integer> getKidsAges() {
    return kidsAges;
}

public void setKidsAges(List<Integer> kidsAges) {
    this.kidsAges = kidsAges;
}
}

Second POJO - Example

public class Example {

private String checkIn;
private String checkOut;
private RoomsInfo roomsInfo;
private Object searchInfo;
private Object crossSellDetail;
private String query;

/**
*
* @param roomsInfo
* @param checkIn
* @param searchInfo
* @param crossSellDetail
* @param query
* @param checkOut
*/
public Example(String checkIn, String checkOut, RoomsInfo roomsInfo, Object searchInfo, Object crossSellDetail, String query) {
super();
this.checkIn = checkIn;
this.checkOut = checkOut;
this.roomsInfo = roomsInfo;
this.searchInfo = searchInfo;
this.crossSellDetail = crossSellDetail;
this.query = query;
}

public String getCheckIn() {
return checkIn;
}

public void setCheckIn(String checkIn) {
this.checkIn = checkIn;
}

public String getCheckOut() {
return checkOut;
}

public void setCheckOut(String checkOut) {
this.checkOut = checkOut;
}

public RoomsInfo getRoomsInfo() {
return roomsInfo;
}

public void setRoomsInfo(RoomsInfo roomsInfo) {
this.roomsInfo = roomsInfo;
}

public Object getSearchInfo() {
return searchInfo;
}

public void setSearchInfo(Object searchInfo) {
this.searchInfo = searchInfo;
}

public Object getCrossSellDetail() {
return crossSellDetail;
}

public void setCrossSellDetail(Object crossSellDetail) {
this.crossSellDetail = crossSellDetail;
}

public String getQuery() {
return query;
}

public void setQuery(String query) {
this.query = query;
}

}

public class TestUtil {

/**
 * This method is used to convert POJO Object to a JSON String...
 * 
 * @param obj
 * @return jsonString
 */

public static String getSerializedJSON(Object obj) {
    ObjectMapper mapper = new ObjectMapper();
    String jsonString = null;
    try {
        jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
        System.out.println("JSON BODY PAYLOAD ====> "+ jsonString);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }

    return jsonString;
}

}

public class UserInfo {

@Test
public static  String createUserWithFullJson() {

List<Integer> list = new ArrayList<Integer>();
list.add(10);

    
RoomsInfo room = new RoomsInfo(2, list);
Example ex = new Example("2023-06-01", "2023-06-02", room, null, null, "Chalets%2B");
    
String UserJsonPayload = TestUtil.getSerializedJSON(ex);
System.out.println(UserJsonPayload);
return UserJsonPayload;
}

}

Actual OutPut

{
  "checkIn" : "2023-06-01",
  "checkOut" : "2023-06-02",
  "roomsInfo" : {
    "adultsCount" : 2,
    "10" : null
  },
  "searchInfo" : null,
  "crossSellDetail" : null,
  "query" : "Chalets%2B"
}

Expected OutPut

{
  "checkIn" : "2023-06-01",
  "checkOut" : "2023-06-02",
  "roomsInfo": [
    {
      "adultsCount": 2,
      "kidsAges": []
    }
  ],
  "searchInfo": null,
  "crossSellDetail": null,
  "query": "Chalets%2B"
}

Solution

  • Assuming you want to Keeps kids age as empty ,modify your Test case to set is as empty array , in your current code your are setting it to a list with a element as 10

    @Test
        public void createUserWithFullJson() {
    
            List<Integer> list = new ArrayList<Integer>();
    
            RoomsInfo room = new RoomsInfo(2, list);
    
            Example ex = new Example("2023-06-01", "2023-06-02", Arrays.asList(room), null, null,
                "Chalets%2B");
    
            String UserJsonPayload = TestUtil.getSerializedJSON(ex);
    
        }
    

    Example POJO

    public class Example {
    
        private String checkIn;
        private String checkOut;
        private List<RoomsInfo> roomsInfo;
        private Object searchInfo;
        private Object crossSellDetail;
        private String query;
    
        /**
         * @param roomsInfo
         * @param checkIn
         * @param searchInfo
         * @param crossSellDetail
         * @param query
         * @param checkOut
         */
        public Example(String checkIn, String checkOut, List<RoomsInfo> roomsInfo, Object searchInfo,
            Object crossSellDetail, String query) {
            super();
            this.checkIn = checkIn;
            this.checkOut = checkOut;
            this.roomsInfo = roomsInfo;
            this.searchInfo = searchInfo;
            this.crossSellDetail = crossSellDetail;
            this.query = query;
        }
    
        public String getCheckIn() {
            return checkIn;
        }
    
        public void setCheckIn(String checkIn) {
            this.checkIn = checkIn;
        }
    
        public String getCheckOut() {
            return checkOut;
        }
    
        public void setCheckOut(String checkOut) {
            this.checkOut = checkOut;
        }
    
        public List<RoomsInfo> getRoomsInfo() {
            return roomsInfo;
        }
    
        public void setRoomsInfo(List<RoomsInfo> roomsInfo) {
            this.roomsInfo = roomsInfo;
        }
    
        public Object getSearchInfo() {
            return searchInfo;
        }
    
        public void setSearchInfo(Object searchInfo) {
            this.searchInfo = searchInfo;
        }
    
        public Object getCrossSellDetail() {
            return crossSellDetail;
        }
    
        public void setCrossSellDetail(Object crossSellDetail) {
            this.crossSellDetail = crossSellDetail;
        }
    
        public String getQuery() {
            return query;
        }
    
        public void setQuery(String query) {
            this.query = query;
        }
    
    
    }
    

    RoomsInfo POJO

    public class RoomsInfo {
    
        private Integer adultsCount;
    
    
        private List<Integer> kidsAges;
    
    
        /**
         * No args constructor for use in serialization
         */
        public RoomsInfo() {
        }
    
        /**
         * @param adultsCount
         * @param kidsAges
         */
        public RoomsInfo(Integer adultsCount, List<Integer> kidsAges) {
            super();
            this.adultsCount = adultsCount;
            this.kidsAges = kidsAges;
        }
    
        public Integer getAdultsCount() {
            return adultsCount;
        }
    
        public void setAdultsCount(Integer adultsCount) {
            this.adultsCount = adultsCount;
        }
    
        public List<Integer> getKidsAges() {
            return kidsAges;
        }
    
        public void setKidsAges(List<Integer> kidsAges) {
            this.kidsAges = kidsAges;
        }
    
    }
    

    Output

    JSON BODY PAYLOAD ====> {
      "checkIn" : "2023-06-01",
      "checkOut" : "2023-06-02",
      "roomsInfo" : [ {
        "adultsCount" : 2,
        "kidsAges" : [ ]
      } ],
      "searchInfo" : null,
      "crossSellDetail" : null,
      "query" : "Chalets%2B"
    }