当前位置: 首页 > 知识库问答 >
问题:

强制jackson反序列化一个特定的字段,即使它是空的?

习淇
2023-03-14

我使用jackson 2.6.3来执行JSON封送/解封。如果有效负载中缺少字段,则不会调用该字段的setter。如果有效负载中缺少字段,我需要插入一些默认值。还有一些业务逻辑检查。如果不在setter中,不确定放在哪里。使用Spring boot 1.4.0。

任何提示/线索都深为感激

共有2个答案

吕霍英
2023-03-14

您可以使用反序列化功能。将未知属性的失败设置为false。

如果需要通过从spring扩展WebMvcConfigrationAdaptor类以添加HttpMessageConverter来覆盖Spring Boot自动配置,则此配置将在反序列化时忽略任何未知属性。

 @Configuration
 class WebConfiguration extends WebMvcConfigurerAdapter{



    @Override
    public void configureMessageConverters(
            List<HttpMessageConverter<?>> converters) {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.indentOutput(true).dateFormat(
                new SimpleDateFormat("yyyy-MM-dd"));

        converters.add(new MappingJackson2HttpMessageConverter(builder.build()
                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
                        false)));


    }
}

希望这对你有帮助。

柴泰平
2023-03-14

您可以将参数化构造函数与构造函数上的@JsonCreator和构造函数参数中的@JsonProperty一起使用。然后Jackson将始终调用此构造函数进行反序列化,即使任何属性为null。如果任何值为null,您可以在那里设置默认值,甚至可以进行业务逻辑检查。

样本:

public class Person {
    private Integer id;
    private String name;

    @JsonCreator
    public Person(@JsonProperty(value = "id") Integer id, @JsonProperty(value = "name") String name) {
        this.id = id != null ? id : Integer.valueOf(1); //setting default
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
 类似资料:
  • 有没有一种方法可以使用Jackson JSON处理器来执行自定义字段级别的序列化?例如,我想让 注意,age=25被编码为数字,而favoritenumber=123被编码为字符串。Jackson将编组为一个数字。在这种情况下,我希望将favoriteNumber编码为字符串。

  • 问题内容: 我无法找出使用杰克逊实现自定义序列化/反序列化的正确方法。我有很多类(〜50),它们带有应被序列化/反序列化而不是原始的原始字段。喜欢: 所有序列化和反序列化都非常相似,我只需要在整数之后添加一个后缀(C,页面,米等)。 一种简单的方法是在每个这样的字段中添加一对/ 注释并实现它们。但是我最终会得到100个 非常相似的 序列化器/反序列化器。 我想到了添加自定义注释的各个领域,说或,这

  • 有没有一个Jackson注释允许将数组反序列化到我的POJO的特定字段中?我可以用自定义的反序列化器很容易地做到这一点,但我希望用类内联的方式来完成。 例如,我从Elasticsearch返回了以下JSON。 我的POJO如下: 我希望“排序”数组(在数组[0]中总是有一个long,在数组[1]中总是有一个String)被反序列化如下: 我发现了另一个问题,唯一的答案是自定义的反序列化器,如果可以

  • 我有这样的Jackson注释类: 假设我不能更改我的类代码。那么,如何让ObjectMapper只覆盖field2的JsonIgnore并将其序列化为json?但我希望它忽略field4。这很简单,只需要几行代码吗? 我的常规序列化代码:

  • 我有这样一门课: 我知道基于typeToClassId的对象obj是什么类型,不幸的是只有在运行时才知道。 我想基于typeToClassId解析出obj——这里最好的方法是什么?注释似乎已经过时了,基于ObjectMapper的东西似乎是对的,但我很难弄清楚最好的方法可能是什么。 类似于类clazz=lookUpClassBasedOnId(typeToClassId)objectMapper的

  • 所以我有 我读过Baeldung的文章和其他东西,但似乎我的选项是自定义类型(这是一个原始类型)或全局类型。如何实现这种自定义序列化?