简体   繁体   中英

REST Assured deserialize JSON Array - Unrecognized field

I want to deserialize the response from: https://bookstore.demoqa.com/BookStore/v1/Books .

I have the Book class:

package test010;

public class Book {

    String isbn;
    String title;
    String subTitle;
    String author;
    String publish_date;
    String publisher;
    int pages;
    String description;
    String website;
}

and the test class:

package test010;

import io.restassured.RestAssured;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.testng.annotations.Test;

import java.util.List;

public class test010 {
    @Test
    public void jsonArray(){


        RestAssured.baseURI = "https://bookstore.demoqa.com/BookStore/v1/Books";
        RequestSpecification httpRequest = RestAssured.given();
        Response response = httpRequest.get();

        JsonPath json = response.jsonPath();

        System.out.println(json.getList("books"));

        List<Book> allBooks = json.getList("books", Book.class);

        for (Book book: allBooks){
            System.out.println("Book title: " + book.title + " and author: " + book.author);
        }

    }

}

I'm getting the error:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "isbn" (class test010.Book), not marked as ignorable (0 known properties: ]) at [Source: (String)"{"isbn":"9781449325862","title":"Git Pocket Guide","subTitle":"A Working Introduction","aut ..

If I use: @JsonIgnoreProperties(ignoreUnknown = true) I get only nulls, but I want the data.

One easy way to solve this problem is make all fields of Book class is public

public class Book {
    public String isbn;
    public String title;
    public String subTitle;
    public String author;
    public String publish_date;
    public String publisher;
    public int pages;
    public String description;
    public String website;
}

Other way is use @Data from Lombok library

import lombok.Data;

@Data
public class Book {
    String isbn;
    String title;
    String subTitle;
    String author;
    String publish_date;
    String publisher;
    int pages;
    String description;
    String website;
}

To solve this problem, all you need is getter and setter of the fields available because when you try to deserialize the JSON into Java POJO then JsonConvertor requires setter property of class to set the object as you can see in below image.

在此处输入图像描述

Therefore, @Data annotation also worked because @Data annotation is responsible for adding getter and setter into the class. So solution for your problem will be

package com.example.springlearning;

import lombok.Data;

public class Book {
String isbn;
String title;
String subTitle;
String author;
String publish_date;
String publisher;
int pages;
String description;
String website;

public String getIsbn() {
    return isbn;
}

public void setIsbn(String isbn) {
    this.isbn = isbn;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getSubTitle() {
    return subTitle;
}

public void setSubTitle(String subTitle) {
    this.subTitle = subTitle;
}

public String getAuthor() {
    return author;
}

public void setAuthor(String author) {
    this.author = author;
}

public String getPublish_date() {
    return publish_date;
}

public void setPublish_date(String publish_date) {
    this.publish_date = publish_date;
}

public String getPublisher() {
    return publisher;
}

public void setPublisher(String publisher) {
    this.publisher = publisher;
}

public int getPages() {
    return pages;
}

public void setPages(int pages) {
    this.pages = pages;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public String getWebsite() {
    return website;
}

public void setWebsite(String website) {
    this.website = website;
}

}

Hope this would help that how @Data works in deserializing your data.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM