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

如何让Jackson库在反序列化空值时使用我的默认初始化值?

夏侯宏旷
2023-03-14

我有以下JSON输入:

{
    "teachers": null,
    "students": [],
    "janitors": ["J1", "J2"]
}

它将映射到这个学校对象。

public class School {
    
    // Child JSON arrays reflecting JSON input
    private List<String> teachers = new ArrayList<>();
    private List<String> students = new ArrayList<>();
    private List<String> janitors = new ArrayList<>();
    
    // Getters and Setters
    public List<String> getTeachers() {
        return teachers;
    }
    public void setTeachers(List<String> teachers) {
        this.teachers = teachers;
    }

    public List<String> getStudents() {
        return students;
    }
    public void setStudents(List<String> students) {
        this.students = students;
    }

    public List<String> getJanitors() {
        return janitors;
    }
    public void setJanitors(List<String> janitors) {
        this.janitors = janitors;
    }
}

这是我到目前为止的映射器配置:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

Jackson库反序列化JSON输入后,尽管将其初始化为数组,但我仍然得到了school.教师=null。我初始化这些数组的原因是为了避免不必要的空检查。

如何让Jackson反序列化器忽略空值或忽略它无法映射到的空节点?

共有1个答案

皇甫飞飙
2023-03-14

可以在类中使用@jsoninclude(jsoninclude.include.non_null)

import com.fasterxml.jackson.annotation.JsonInclude;
@JsonInclude(JsonInclude.Include.NON_NULL)
public class School {
    
    // Child JSON arrays reflecting JSON input
    private List<String> teachers = new ArrayList<>();
    private List<String> students = new ArrayList<>();
    private List<String> janitors = new ArrayList<>();
}

也可以在字段级别使用;以防您希望某些字段为空。

import com.fasterxml.jackson.annotation.JsonInclude;

public class School {

    // Child JSON arrays reflecting JSON input
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private List<String> teachers = new ArrayList<>();

    @JsonInclude(JsonInclude.Include.NON_NULL)
    private List<String> students = new ArrayList<>();
    
    private List<String> janitors = new ArrayList<>();
}

因此,在上面的场景中,如果janitors为null,它将显示为null。

 类似资料:
  • 当反序列化各种JSON消息时,我希望为某种类型的属性提供默认值。通常建议简单地在类中指定值,但如果必须跨许多类这样做,这很容易出错。您可能会忘记一个值,并以而不是默认值结束。我的意图是将每个的属性设置为。由于正是试图消除的内容,因此将它们与Jackson一起使用是令人沮丧的。 Jackson允许您自定义反序列化过程的大多数特性都集中在作为输入的JSON上,而不是围绕实例化要反序列化到的对象的过程。

  • 我尝试使用以下代码反序列化API中接收的JSON对象: 我的类使用Lombok生成构造函数、getter和setter,如下所示: 这两个属性都应该是可选的,如果没有提供,则使用类定义中指定的默认值。但是,如果我现在尝试反序列化JSON 字段为。根据我的理解,以及我找到的所有示例代码,应该是一个空列表。 编辑:不是重复的,因为我使用的是没有选项的Lombok

  • 像这样: 我该怎么办?

  • 考虑以下代码 VS2013编译器发出以下警告: 警告C4351:新行为:数组“B::member”的元素将默认初始化1 这里有记载 使用C 11,并应用“默认初始化”的概念,意味着B. part的元素将不会被初始化。 但我认为,成员{}应该执行值初始化,而不是默认初始化。VS2013编译器是否损坏? 8.5美元/6 默认初始化类型为T的对象意味着:-如果T是(可能是cv限定的)类类型(第9条),则

  • 我想通过扩展默认的反序列化器来创建自己的反序列化器,在其后面设置更多的值: 如您所见,我还想将此DTO母类重用于其他DTO。 我没有找到任何这样的例子。我真的是世界上第一个 反序列化的“AsUsual”(p,ctxt)应该是什么 我应该使用什么motherclass?JsonDeserializer/StdDeserializer/UntypedObjectDeserializer 反序列化程序会

  • 我有JSON反序列化和映射到枚举的问题。我从外部API获取JSON,类似于下面两个例子: 我想将空值映射到一些默认的枚举值。 模型对象 和枚举类 对于exists,值模型类包含正确的枚举,但如果我从API获取< code>null,它在模型中仍然是< code>null。 我试图创建一些由< code>@JsonCreator注释的方法,使用< code > @ JsonEnumDefaultVa