小编典典

Json Array到Pojo

json

我正在尝试将以下Json数组响应解组到RestTemplate中的pojos集合。

[{
  "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",
      }
}]

我创建了一个对应的Java Pojo类

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;
}

}

我正在使用RestTemplate,但是我有一个带有空属性值的客户端数组。

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

阅读 37

收藏
2020-07-27

共1个答案

小编典典

您的大多数POJO字段都是类型,String但JSON的值中没有双引号("")。您的JSON应该如下所示才能有效:

[
    {
        "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"
        }
    }
]

另外,您的JSON有一个email字段,但您的ClientPOJO没有email字段,并且您currency在POJO中声明的字段不是String,它是一个具有两个字段的对象,因此您的ClientPOJO应该为:

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;
    }

}

有一个新Currency对象:

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;
    }

}

另一方面,您正在尝试反序列化Client对象数组,但是JSON是对象数组,其中每个对象都包含一个Client对象,因此需要包装它:

public class Cliente {

    private Client client;

    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

}

然后可以使用restTemplate或使用反序列化JSON ObjectMapper
带有restTemplate

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

使用ObjectMapper(杰克逊的方法genericMessageConverter完全相同,它使用ObjectMapper如下):

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

另一件事是,@JsonProperty如果JSON字段在JSON和POJO中具有相同的名称,则在POJO中不需要注释。

2020-07-27