使 Jackson 在 JSON 中的重复属性上失败

问题描述 投票:0回答:2

我使用

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

final class DataPoint {
  private final int count;
  private final int lower;
  private final int median;
  private final int upper;

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

  // getters...
}

这是我反序列化的 JSON:

{
  "count": 3,
  "lower": 2,
  "median": 3,
  "upper": 4
}

效果很好。现在我破坏 JSON,即复制

lower
属性:

{
  "count": 4,
  "lower": 2,
  "lower": 3,
  "median": 4,
  "upper": 5
}

现在我得到了

count == 4
lower == 3
。相反,我希望
Jackson
反序列化失败,因为 JSON 中存在重复的属性 (
lower
)。

这是反序列化代码:

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

各位,在反序列化具有重复属性键的 JSON 时,我可以使

Jackson
失败吗?

非常感谢你们,伙计们!

java json jackson deserialization
2个回答
12
投票

您可以启用

STRICT_DUPLICATE_DETECTION
以使解析器在存在重复属性时抛出
Exception
,例如:

String s = "{\"count\": 4,\"lower\": 2,\"lower\": 3,\"median\": 4,\"upper\": 5}";
ObjectMapper mapper = new ObjectMapper();
mapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
JsonNode readTree = mapper.readTree(s);
System.out.println(readTree.toString());

这将抛出以下异常:

Exception in thread "main" com.fasterxml.jackson.core.JsonParseException: Duplicate field 'lower'

这是文档。


0
投票

对于 Spring,此配置使用

STRICT_DUPLICATE_DETECTION

可以正常工作
@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.enable(JsonParser.Feature.STRICT_DUPLICATE_DETECTION);
        return objectMapper;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.