【问题标题】:How specify deserialization order in jackson?如何在杰克逊中指定反序列化顺序?
【发布时间】:2018-09-04 02:34:38
【问题描述】:

我有两个字段:startDateendDate,我需要确保结束日期等于或晚于开始日期。最好的方法是什么?

我想确保 endDatestartDate 之后被反序列化,这样我就可以将逻辑放在它的 setter 方法中,例如:

@JsonSetter( "end" )
public void setEnd(String end)
{
    this.endDate = parseZonedDateTime( end );

    //invalid
    if ( this.endDate.compareTo( this.startDate ) < 0 )
    {
        //Throw a validation exception
    }
}

但这只有在保证首先设置 start 时才有效。

【问题讨论】:

  • 为什么不写一个自定义的反序列化器?
  • 添加一个构造函数来获取所有字段并在那里进行验证。有关构造函数注释的说明,请参阅this question
  • 可能不是一个干净的解决方案,但一种 hack 是放置一个占位符并在最后注入或替换它?
  • @AlexanderPolozov 是序列化,不是反序列化

标签: java json spring jackson


【解决方案1】:

我有两个字段:startDate 和 endDate,我需要确保结束日期等于或晚于开始日期。最好的方法是什么?

杰克逊不会尝试这样做。杰克逊应该只专注于将 json 转换为对象。杰克逊应该注意值的有效性。也不是反序列化顺序。

尝试在杰克逊的转换之后验证,手动或通过 JSR-303 等验证框架。

【讨论】:

  • 当杰克逊没有 post 构造时我会怎么做
  • 我更喜欢Result result = objectMapper.readValue(json, Result.class); result.validat()
  • 我做不到。这是春天。
  • bbenson.co/post/spring-validations-with-examples 展示了一种spring验证的方式
猜你喜欢
  • 2017-09-10
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 2012-11-19
  • 2016-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多