我有一个json,需要将其映射到单个平面POJO对象中。我正在使用jackson-databind,似乎不支持这些类型的操作。有什么建议吗?
{
"id": 1,
"name": "Alex",
"emailId": "alex@gmail.com",
"address": {
"address": "21ST & FAIRVIEW AVE",
"district": "district",
"city": "EATON",
"region": "PA",
"postalCode": "18044",
"country": "US"
}
}
public class singlePojo{
String id;
String name;
String emailId;
String address;
String district;
String city;
String region;
String postalCode;
}
答案 0 :(得分:0)
使用@JsonAnyGetter
映射address
@JsonAnyGetter批注允许灵活地使用Map字段作为标准属性。
public class singlePojo{
String id;
String name;
String emailId;
Map<String,Object> address;
@JsonAnyGetter
public Map<String, Object> getAddress() {
return address;
}
}
如果您序列化此类,则输出为
{
"id": 1,
"name": "Alex",
"emailId": "alex@gmail.com",
"address": "21ST & FAIRVIEW AVE",
"district": "district",
"city": "EATON",
"region": "PA",
"postalCode": "18044",
"country": "US"
}
答案 1 :(得分:0)
您可以使用@JsonProperty
在POJO中创建自定义设置器,以将地图展平为各个字段:
@SuppressWarnings("unchecked")
@JsonProperty("address")
public void setDistrict(Map<String,String> map) {
Map<String,String> address = map.get("address");
this.district = address.get("district");
}
您必须对来自地图的POJO中的每个字段执行此操作,因此它可能是冗长且重复的。
您还可以使用可同时处理所有字段的自定义反序列化器:
public class SimplePojoDeserializer extends StdDeserializer<SimplePojo> {
@Override
public SimplePojo deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
SimplePojo pojo = new SimplePojo();
product.setAddress(node.get("address").get("address").textValue());
product.setDistrict(node.get("address").get("district").textValue());
// ...
return pojo;
}
}
在这种情况下,您必须在POJO中执行 all 个字段,而不仅仅是地址字段。
更多详细信息here。