java - 如何使用 Jackson 进行部分反序列化

标签 java jackson

在我的 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/

相关文章:

java - Spring @Value 注释不取消引用值?

java - 用 jackson 以两种不同的方式序列化一个类

java - 如何反序列化 XML 并在给定元素后获取特定键的值

java - json jackson异常 map 序列化

java - 如何获取类的类型进行比较

java - 随着数组值的变化,将数组的值存储在单独的文件中

Java - 外部站点的密码加密/解密

java - <MVC :annotation-driven/> and binding to collections

java - RequestBody JSON 格式有单引号

java - Apache Camel 和 jackson