Как сделать частичную десериализацию с Джексоном - PullRequest
1 голос
/ 25 сентября 2019

В моем микросервисе REST я запрашиваю объект из другого сервиса, который возвращает мне огромный вложенный JSON, например:

{
  "address": "19th Street",
  "contact_info": {
     "phones": {
        "home": {
           "first": {
             "another_nested": 1234
           }
        }
     } 
  } 
}

Что мне нужно, чтобы получить эти данные из другого сервиса, выполнить только изменениев первом поле, а затем отправьте его через HTTP.Чего я пытаюсь избежать, так это десериализовать все на моей стороне и поддерживать здесь занятия.Есть ли способ получить необработанное значение contact_info и просто получить представление адреса с Джексоном?Как то так:

public class FullAddress {
  String address;
  RawValue contactInfo;
}

Ответы [ 2 ]

1 голос
/ 25 сентября 2019

Простейшим подходом было бы использование JsonNode:

@Data
public class FullAddress {
    private String address;
    private JsonNode contactInfo;
}

Или либо Map<String, Object>:

@Data
public class FullAddress {
    private String address;
    private Map<String, Object> contactInfo;
}

. Он работает как для сериализации, так и для десериализации.


Однако, если вы хотите сохранить необработанный JSON, вы можете определить собственный десериализатор:

public class RawJsonDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctxt)
           throws IOException, JsonProcessingException {

        ObjectMapper mapper = (ObjectMapper) jp.getCodec();
        JsonNode node = mapper.readTree(jp);
        return mapper.writeValueAsString(node);
    }
}

И затем использовать его следующим образом:

@Data
public class FullAddress {

    private String address;

    @JsonDeserialize(using = RawJsonDeserializer.class)
    private String contactInfo;
}

Однако для сериализации обратно можно пометить поле contactInfo с помощью @JsonRawValue.

1 голос
/ 25 сентября 2019

Вы можете использовать JsonIgnoreProperties в классе документы , поэтому он будет игнорировать все другие свойства, отсутствующие в классе

// To ignore any unknown properties in JSON input without exception:
@JsonIgnoreProperties(ignoreUnknown=true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...