【问题标题】:How to make fields in type class mandatory based on the parent class during deserialization反序列化时如何根据父类强制类型类中的字段
【发布时间】:2021-01-19 12:01:23
【问题描述】:

我正在尝试反序列化我的 JSON,一切正常,但我想添加一些条件以使其更好。

以下是我的父类基于哪个反序列化发生:

public class ParentJSON{
    @NotNull
    private String name;
    private ChildJSON type;
}

type 字段是可选的,是 JSON。但是,如果 JSON 中存在 type 字段,那么我想将 ChildJSON 中的字段设为必填:

public class ChildJSON{
    private String childName;
    private String childType;
}

如果我直接将@NotNull 添加到我的ChildJSON 字段中,那么如果JSON 中不存在type,它将引发错误。

这是我的客户端文件,它将读取 JSONFILE:

public class Client {
    public static void main(String args[]) {
        final ObjectMapper objectMapper = new ObjectMapper();
        ParentJSON json = objectMapper.readValue(ApplicationMain.class.getResourceAsStream("/JSONFile.json"), ParentJSON.class);
    }
}

我的 json 看起来像这样:

{
    {
      "name":"Hello"
    },
    {
      "name":"Bye",
      "type":{
        "childName":"childByeName",
        "childType":"childByeType"
      }
    }
}

【问题讨论】:

    标签: java json jackson json-deserialization


    【解决方案1】:

    如果您的 Parent 类如下所示,则 type 字段不是必需的:

    public class ParentJSON{
        @NotNull
        private String name;
        @Valid
        private ChildJSON type;
    }
    

    要评估 ChildJSON 约束需要 @Valid 注释。 然后,您可以将 @NotNull 添加到您的 Child 类字段:

    public class ChildJSON{
        @NotNull
        private String childName;
        @NotNull
        private String childType;
    }
    

    只有在 ParentJSON 类中的 type 字段不为 null 时,才需要 ChildJSON 字段。

    此外,如果您希望 JSON 看起来完全一样,您将需要更新您的对象映射器以仅序列化非空字段。

    final ObjectMapper objectMapper = new ObjectMapper().setSerializationInclusion(JsonInclude.Include.NON_NULL);
    

    注意:确保您为 ParentJSON 类提供了两个构造函数 - 一个带有类型字段,一个没有它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-13
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      相关资源
      最近更新 更多