【问题标题】:Jackson Deserializing JSON, skip objects that don't have required fields?Jackson 反序列化 JSON,跳过没有必填字段的对象?
【发布时间】:2016-09-09 12:58:56
【问题描述】:

使用 Jackson 将 JSON 响应反序列化为 DTO。

对于给定的响应:

[ {
    foo : "bar",
    value : "hello world"
},
{
    foo : "bar",
    value : "hello world"
},
{
    foo : "bar",
    value : "hello world"
},
{
    foo : "bar",
} ]

您可以看到该数组中的所有对象,但其中一个在架构中不一致(最后一个)。

在查看 StackOverflow 上的其他一些相关问题后:

deserializing json using jackson with missing fields

Ignore null fields when DEserializing JSON with Gson or Jackson

他们仍然从那个不规则的 JSON 对象创建一个对象。

这意味着我需要遍历这个列表并通过实现清理方法删除任何不具有属性“值”的对象。

我想知道的是,Jackson 可以为我做这个业务逻辑吗?

If this JSON object has all the required fields
Then create a new DTO
Else
Skip to next JSON object in response

我的带有 Jackson 注释的 DTO:

    @JsonIgnoreProperties(ignoreUnknown = true)
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public final class FooDTO {

        private final String foo;
        private final String value;

        /**
         * Constructor
         *
         * @param foo           String
         * @param value String
         */
        @JsonCreator
        public FooDTO(@JsonProperty("foo") final String foo, @JsonProperty("value") final String value) {
            this.foo = checkNotNull(foo, "foo required");
            this.value = value;
        }

        @JsonProperty("foo")
        public void setFoo(final String foo) {
            this.foo = foo;
        }

        /**
         * @return String
         */
        public String foo() {
            return foo;
        }

    etc...

给定 JSON 响应的结果是初始化 3 个 DTO,而不是 4 个。

【问题讨论】:

  • stackoverflow.com/a/37722790/4969140 这能满足您的需求吗?
  • 这只是我的看法,但我认为这个逻辑不应该放在序列化库中。查看发布数据的端点,不清楚是否会透明地省略整个块。
  • 我睡觉推迟,@JonPeterson。这个逻辑属于序列化(输入接收)阶段至少有两个很好的理由:1)在我看来,这就像经典的输入验证规则,你确实想尽快检测和丢弃(或以某种方式处理)尽可能和 2) 出于性能考虑。解析器已经遍历了 json 数组。为了输入验证,您的建议在内存中添加了第二次迭代
  • 这是用于序列化而不是反序列化,因此似乎用于输出,而不是输入。所以 1. 这将尽可能晚而不是尽可能早 2. 在序列化之前迭代数组将大致相当于在数据流入时在序列化器中进行。即使它慢了 1 毫秒(必须是一个相当大的数据集),我个人宁愿有明显的逻辑,然后有人想知道为什么某些项目不在输出中。再说一次,我也从来都不是 AOP 的忠实粉丝。

标签: java json jackson deserialization


【解决方案1】:

也许下面的类注释可能会有所帮助?

@JsonIgnoreProperties(ignoreUnknown = true)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 2018-07-17
    • 2016-10-23
    • 1970-01-01
    • 2023-03-13
    • 2017-08-02
    • 2017-04-04
    相关资源
    最近更新 更多