Json Array to Pojo

后端 未结 1 599
粉色の甜心
粉色の甜心 2020-12-21 07:32

I\'m trying to unmarshal the following Json array response to a collection of pojos in RestTemplate.

[{
  \"client\":{
        \"id\": 6364,
        \"name\"         


        
相关标签:
1条回答
  • 2020-12-21 08:15

    Most of your POJO fields are of type String but your JSON has values without double quotes (""). Your JSON should be as follows to be valid:

    [
        {
            "client": {
                "id": "6364",
                "name": "7Seven7 Insurance Inc",
                "email": "donna@7seven7ins.com",
                "currency": {
                    "name": "United States of America, Dollars",
                    "symbol": "$"
                },
                "address": "941 Elm Ave. #5 ",
                "city": "Long Beach",
                "province": "CA",
                "zip_code": "90813",
                "country": "United States",
                "full_address_with_comma": "941 Elm Ave. #5, Long Beach, CA, 90813, United States",
                "phone": "562-556-4035",
                "fax": "562-381-7500",
                "custom_field_name": "listed",
                "custom_field_value": "false",
                "created_at": "2010-07-18T00:08:10Z",
                "updated_at": "2010-07-21T11:04:58Z"
            }
        },
        {
            "client": {
                "id": "6365",
                "name": "Affinity",
                "email": "CGregory@affinitygroup.com",
                "address": "2575 Vista Del Mar ",
                "city": "Ventura",
                "province": "California",
                "zip_code": "93001",
                "country": "United States",
                "full_address_with_comma": "2575 Vista Del Mar, Ventura, California, 93001, United States",
                "phone": "(270) 901-2913",
                "fax": "null",
                "currency": {
                    "name": "United States of America, Dollars",
                    "symbol": "$"
                },
                "custom_field_name": "null",
                "custom_field_value": "null",
                "created_at": "2010-07-18T00:08:10Z",
                "updated_at": "2010-07-18T00:08:10Z"
            }
        }
    ]
    

    Also, your JSON has an email field but your Client POJO has not email field, and your declared currency field in the POJO is not a String, it's an object with two fields, so your Client POJO should be:

    public class Client {
    
        private String id;
        private String name;
        private String email;
        private Currency currency;
        private String address;
        private String city;
        private String province;
        private String zip_code;
        private String country;
        private String full_address_with_comma;
        private String phone;
        private String fax;
        private String custom_field_name;
        private String custom_field_value;
        private String created_at;
        private String updated_at;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Currency getCurrency() {
            return currency;
        }
    
        public void setCurrency(Currency currency) {
            this.currency = currency;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getCity() {
            return city;
        }
    
        public void setCity(String city) {
            this.city = city;
        }
    
        public String getProvince() {
            return province;
        }
    
        public void setProvince(String province) {
            this.province = province;
        }
    
        public String getZip_code() {
            return zip_code;
        }
    
        public void setZip_code(String zip_code) {
            this.zip_code = zip_code;
        }
    
        public String getCountry() {
            return country;
        }
    
        public void setCountry(String country) {
            this.country = country;
        }
    
        public String getFull_address_with_comma() {
            return full_address_with_comma;
        }
    
        public void setFull_address_with_comma(String full_address_with_comma) {
            this.full_address_with_comma = full_address_with_comma;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        public String getFax() {
            return fax;
        }
    
        public void setFax(String fax) {
            this.fax = fax;
        }
    
        public String getCustom_field_name() {
            return custom_field_name;
        }
    
        public void setCustom_field_name(String custom_field_name) {
            this.custom_field_name = custom_field_name;
        }
    
        public String getCustom_field_value() {
            return custom_field_value;
        }
    
        public void setCustom_field_value(String custom_field_value) {
            this.custom_field_value = custom_field_value;
        }
    
        public String getCreated_at() {
            return created_at;
        }
    
        public void setCreated_at(String created_at) {
            this.created_at = created_at;
        }
    
        public String getUpdated_at() {
            return updated_at;
        }
    
        public void setUpdated_at(String updated_at) {
            this.updated_at = updated_at;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
    }
    

    with a new Currency object:

    public class Currency {
    
        private String name;
        private String symbol;
    
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getSymbol() {
            return symbol;
        }
        public void setSymbol(String symbol) {
            this.symbol = symbol;
        }
    
    }
    

    On the other hand, you are trying to deserialize an array of Client objects, but your JSON is an array of objects where each object contains a Client object, so you need to wrap it:

    public class Cliente {
    
        private Client client;
    
        public Client getClient() {
            return client;
        }
    
        public void setClient(Client client) {
            this.client = client;
        }
    
    }
    

    and then you could deserialize your JSON with the restTemplate or with an ObjectMapper.
    With a restTemplate:

    Cliente[] clients= restTemplate.getForObject(requestUrl, Cliente[].class);
    

    With an ObjectMapper (Jackson's genericMessageConverter does exactly the same, it uses an ObjectMapper as follows):

    Cliente[] clientes= mapper.readValue(jsonStr, Cliente[].class);
    

    Another thing is, you do not need the @JsonProperty annotations in your POJO if your JSON fields have the same name in the JSON and in the POJO.

    0 讨论(0)
提交回复
热议问题