Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
421 views
in Technique[技术] by (71.8m points)

jackson - 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": "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",
      }
}]

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);
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...