在我的 REST 微服务中,我从另一个服务请求一个对象,该对象返回一个巨大的嵌套 JSON,例如:
{
"address": "19th Street",
"contact_info": {
"phones": {
"home": {
"first": {
"another_nested": 1234
}
}
}
}
}
我需要从另一个服务获取此数据,仅在第一个字段中执行更改,然后通过 HTTP 发送它。我要避免的是反序列化我这边的所有内容,并且必须在此处维护类。
有没有一种方法可以获取 contact_info
的原始值,并且只用 Jackson 表示地址?像这样:
public class FullAddress {
String address;
RawValue contactInfo;
}
最佳答案
最简单的方法是使用 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
.
关于java - 如何使用 Jackson 进行部分反序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58102069/