我有下一个大JSON...

{
  "field1": "value1",
  "field2": "value2",
  ...
  "field100": "value100",
}

...和适当的POJO

@Builder
@Data
public class BigJsonDto{
    private String field1;
    private String field2;

    private String field100;
}

假设所有的字段都是必填的并且可以为空,除了field1,它的值不能为null.

因此,我想告诉Jackson(或其他方式),如果一个或多个必填字段的值为null,则停止序列化,而不是忽略它(值为@JsonInclude).我怎么才能到达它呢?

如果可以使用内置ObjectMapper,那就太好了.

我try 使用@JsonProperty(required = true)批注,但正如我所见,该批注用于反序列化.因此,在本例中,我获得了具有空值的必填字段.

推荐答案

我认为您可以将@NonNull注释添加到需要不为空的字段中.然后,无论何时构建BigJsonDto对象,都可以try 处理该异常.例如,下面的代码将引发以下异常

Exception in thread "main" java.lang.NullPointerException: field1 is marked non-null but is null
    at BigJsonDto.<init>(StackOverflowQuestion.java:21)
    at BigJsonDto$BigJsonDtoBuilder.build(StackOverflowQuestion.java:21)
    at StackOverflowQuestion.main(StackOverflowQuestion.java:16)
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Builder;
import lombok.Data;
import lombok.NonNull;

public class StackOverflowQuestion {

    public static void main(String[] args) throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        var output = mapper.writeValueAsString(
                BigJsonDto.builder()
                        // uncomment this line to not throw exception
                        //.field1("a")
                        .field2("b")
                        .field100("c").build());
        System.out.println(output);
    }
}

@Builder
@Data
class BigJsonDto {
    @NonNull
    private String field1;
    private String field2;
    private String field100;

}

Java相关问答推荐

Spring安全实现多个SQL表身份验证

如何将kotlin代码转换为java

@ IdClass with @ Inheritance(策略= InheritanceType. SINGLE_TABLE)

Junit with Mockito for java

为什么我的ArrayList索引的索引总是返回-1?

Java中如何根据Font.canDisplay方法对字符串进行分段

具有多种令牌类型和段的复杂Java 17正则表达式

如何仅使用键/ID的一部分(组合)高效地返回映射值?

为什么当我创建Robot对象时,JavaFX引发IlLegalStateException异常?

Android Java:已设置但未读取SharedPreferences

在JDK Flight Recorder中只记录单个线程

在Java泛型中使用通配符时,如何推断类型

将基于实例编号的对象列表拆分为新的对象列表

升级版本后出现非法访问错误

获取月份';s在java中非UTC时区的开始时间和结束时间

无泄漏函数的Java DRY

放置在变量中的Java成员引用不相等

如何在Java上为循环数组从synchronized迁移到ReentrantLock

如何在Java中正确实现填字游戏求解器

将天数添加到ZonedDateTime不会更改时间