获取杰克逊的未知领域列表

时间:2015-06-17 14:17:28

标签: java json jackson

我有一个JSON模式,以及一个与模式匹配的json字符串,除了它可能有一些额外的字段。如果那些字段在那里,如果我不添加objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);,杰克逊将抛出异常。有没有办法获取这些额外字段的集合来记录它们,即使我抛出异常?

这里是代码的相关位:

public boolean validate(Message<String> json) {
    List<String> errorList = jsonSchema.validate(json.getPayload());
    ObjectMapper mapper = new ObjectMapper();
    try {
        Update update = mapper.readValue(json.getPayload(), Update.class);
    } catch (IOException e) {
        System.out.println("Broken");
    }
    if(!errorList.isEmpty()) {
        LOG.warn("Json message did not match schema: {}", errorList);
    }
    return true;
}

2 个答案:

答案 0 :(得分:11)

我认为没有开箱即用的选项。

然而,您可以将@JsonAnyGetter和@JsonAnySetter中的这些未知字段保存在地图(Hashmap,Treemap)中,如this articlethis one中所示。

将此添加到您的Update类:

  private Map<String, String> other = new HashMap<String, String>();

  @JsonAnyGetter
  public Map<String, String> any() {
   return other;
  }

 @JsonAnySetter
  public void set(String name, String value) {
   other.put(name, value);
  }

如果额外字段列表不为空,您可以自己抛出异常。检查的方法:

 public boolean hasUnknowProperties() {
   return !other.isEmpty();
  }

答案 1 :(得分:2)

如果您只是想知道第一个未知属性(名称)是什么,我认为您获得的异常确实引用了该属性名称。 由于处理在第一个未知属性处停止(或者,如果忽略,则跳过该值),您将无法获得更多信息。

建议使用@JsonAnySetter是一个不错的选择。