Search code examples
jsonjacksonresttemplate

Json Array to Pojo


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

[{
  "client":{
        "id": 6364,
        "name": "7Seven7 Insurance Inc",
        "email": "[email protected]",
        "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":"[email protected]",
        "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",
      }
}]

I have created a corresponding Java Pojo class

public class Client {
@JsonProperty("id")
private String id;
@JsonProperty("name")
private String name;
@JsonProperty("currency")
private String currency;
@JsonProperty("address")
private String address;
@JsonProperty("city")
private String city;
@JsonProperty("province")
private String province;
@JsonProperty("zip_code")
private String zip_code;
@JsonProperty("country")
private String country;
@JsonProperty("full_address_with_comma")
private String full_address_with_comma;
@JsonProperty("phone")
private String phone;
@JsonProperty("fax")
private String fax;
@JsonProperty("custom_field_name")
private String custom_field_name;
@JsonProperty("custom_field_value")
private String custom_field_value;
@JsonProperty("created_at")
private String created_at;
@JsonProperty("updated_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 String getCurrency() {
    return currency;
}
public void setCurrency(String 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;
}

}

I'm using RestTemplate, but I have got an array of clients with empty attribute values.

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

Solution

  • 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": "[email protected]",
                "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": "[email protected]",
                "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.