将嵌套的json值映射到单个POJO jackson-databind

时间:2019-03-08 18:26:15

标签: java json jackson-databind

我有一个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;

}

2 个答案:

答案 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