Сопоставить вложенные значения json с одним POJO jackson-databind - PullRequest
0 голосов
/ 08 марта 2019

У меня есть 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 голосов
/ 08 марта 2019

Вы можете создать пользовательский установщик в вашем POJO, используя @JsonProperty, который выравнивает карту по отдельным полям:

@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, а не только поля адреса.

Некоторые подробности здесь .

0 голосов
/ 08 марта 2019

Используйте @JsonAnyGetter для отображения address

Аннотация @JsonAnyGetter позволяет гибко использовать поле карты в качестве стандартных свойств.

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"
}
...