【问题标题】:JSON -> Immutable custom Java object. Insufficient data in JSONJSON -> 不可变的自定义 Java 对象。 JSON 中的数据不足
【发布时间】:2017-05-05 08:01:39
【问题描述】:

我使用Jackson 将 JSON 反序列化为不可变的自定义 Java 对象。这是课程:

final class DataPoint {
  private final int count;
  private final double mean;

  @JsonCreator
  DataPoint(
      @JsonProperty("count") int count,
      @JsonProperty("mean") double mean) {
    if (count <= 0) {
      throw new IllegalArgumentException("...");
    }
    this.count = count;
    this.mean = mean;
  }

  // getters...
}

这是我反序列化的 JSON:

{
  "count": 1,
  "mean": 2
}

它工作正常。现在我打破 JSON,即删除一个属性:

{
  "count": 1
}

反序列化代码为:

String json = "..."; // the second JSON
ObjectMapper mapper = new ObjectMapper();
DataPoint data  = mapper.readValue(json, DataPoint.class);

现在我得到count == 1mean == 0.0。相反,我希望杰克逊抛出一个异常,因为 JSON 中缺少一个必填字段。我该如何存档?

非常感谢你们!

【问题讨论】:

  • 如果换成@JsonProperty("mean") Double mean 看看是否为空怎么办?
  • @StanislavL:嗯,这是一种解决方案。比你好多了!我说得对吗,杰克逊没有办法让我在没有拳击的情况下得到我想要的东西?
  • @StanislavL 您将无法判断它是丢失还是存在但设置为 null。
  • @shmosel 无论如何它都会失败。无法将 null 转换为 double,但您的答案是 +1 更好。我建议了一个解决方法。
  • @StanislavL 只要定义了属性,从 null 到 0 的隐式转换是可以接受的。无论哪种情况,您的解决方案都会引发异常。当然,只有 OP 才能说这是否有问题。

标签: java json jackson deserialization


【解决方案1】:

由于您使用的是构造函数,您可以启用DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES 以在缺少属性时引发异常:

String json = "..."; // the second JSON
ObjectMapper mapper = new ObjectMapper()
        .enable(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES);
DataPoint data  = mapper.readValue(json, DataPoint.class);

【讨论】:

  • 非常感谢!你的建议很好用。我只需要创建 Jersey BOM 的版本。再次感谢,伙计!
猜你喜欢
  • 2019-12-30
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2015-09-22
相关资源
最近更新 更多