簡體   English   中英

獲取傑克遜的未知領域列表

[英]Get list of unknown fields from Jackson

我有一個JSON模式和一個匹配模式的json字符串,除了它可能有一些額外的字段。 如果我不添加objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);那么如果那些字段在那里,傑克遜將拋出異常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;
}

我不認為有這樣的選擇開箱即用。

但是,您可以將@JsonAnyGetter和@JsonAnySetter中的這些未知字段保存在地圖(Hashmap,Treemap)中,如本文本文所示

將其添加到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(); } 

如果您只是想知道第一個未知屬性(名稱)是什么,我認為您獲得的異常確實引用了該屬性名稱。 由於處理在第一個未知屬性處停止(或者,如果忽略,則跳過該值),您將無法獲得更多信息。

建議使用@JsonAnySetter是個不錯的選擇。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM