2012-04-19 107 views
22

我想使用傑克遜JSON採取一個字符串,並確定它是否是有效的JSON。任何人都可以建議使用代碼示例(Java)?如何驗證JSON與傑克遜JSON

+1

你怎麼defina JSON是合法的? – Slavus 2012-04-19 12:13:18

+1

@Slavus:任何滿足JSON語法標準的字符串都是有效的JSON。我們沒有定義有效的JSON。 – Vivek 2014-03-13 09:54:12

+0

我遲到了,這可能在2012年不可用,但您是否想過[JSON模式](http://json-schema.org/)? – Stroboskop 2016-10-21 13:30:08

回答

27

不知道您的使用情況下這是什麼,但是這應該這樣做:

public boolean isValidJSON(final String json) { 
    boolean valid = false; 
    try { 
     final JsonParser parser = new ObjectMapper().getJsonFactory() 
      .createJsonParser(json); 
     while (parser.nextToken() != null) { 
     } 
     valid = true; 
    } catch (JsonParseException jpe) { 
     jpe.printStackTrace(); 
    } catch (IOException ioe) { 
     ioe.printStackTrace(); 
    } 

    return valid; 
} 
+3

getJsonFactory()已棄用。 – Arash 2015-06-23 05:38:44

+0

簡短而優雅的解決方案可以在這裏找到[感謝@pdem](http://stackoverflow.com/a/29414638/452708) '嘗試{0} {0} {0} ObjectMapper objectMapper = ...; JsonNode jsonNode = objectMapper.readTree(yourJsonString); (JsonProcessingException e){........}' – Abhijeet 2015-11-17 11:43:00

+1

這兩種方法折舊:getJsonFactory()。createJsonParser(json)。 使用此istead:getFactory()。createParser(json) – kiedysktos 2016-12-23 07:51:03

10

我會建議分別使用Bean Validation API:即首先將數據綁定到一個POJO,然後再驗證POJO。數據格式級別Schema在我看來並不是非常有用:通常仍然需要驗證更高級別的問題,並且模式語言本身很笨拙,尤其是,那些使用格式被驗證的(XML Schema和JSON Schema都有這個基本缺陷)。這樣做可以使代碼更加模塊化,可重用,並分離問題(序列化,數據驗證)。

但我實際上會更進一步,並建議您看看DropWizard - 它集成了Jackson和Validation API實現(來自Hibernate項目)。

+0

Dropwizard似乎已經搬到了新家(www.dropwizard.io),現在自稱「這是一個用於開發適用於操作系統的高性能RESTful web的Java框架服務」。還沒有閱讀,但它可能仍然集成了傑克遜和驗證API。不知道你是否需要休息。 – Wivani 2016-02-16 20:40:32

+0

是的,截至目前爲止,DropWizard仍然集成了Jackson和Validation API(二月2016)。我沒有看到這個項目正在發生變化,現在已經很成熟了。您當然可以使用其他綁定庫(JAX-RS具有高度可插入性),但是作爲基線,這2個庫可能會保留。 – StaxMan 2016-02-24 17:09:15

12

雖然知覺的答案很可能會滿足衆多的需求,也有一些問題,它不會趕上,其中之一是重複鍵,請看下面的例子:

String json = "{ \"foo\" : \"bar\", \"foo\" : \"baz\" }"; 

作爲補充,可以檢查使用以下代碼複製密鑰:

ObjectMapper objectMapper = new ObjectMapper(); 
objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY); 
objectMapper.readTree(json); 

它在重複密鑰或其他錯誤上拋出JsonProcessingException

7

與傑克遜我用這個函數:

public static boolean isValidJSON(final String json) throws IOException { 
    boolean valid = true; 
    try{ 
     objectMapper.readTree(json); 
    } catch(JsonProcessingException e){ 
     valid = false; 
    } 
    return valid; 
} 
1

另一種辦法是用Java 8.使用java.util.Optional這允許返回一個對象,在調用代碼中一個功能更強大的方法來使用。

這是一種可能的實現:

public Optional<JsonProcessingException> validateJson(final String json) { 
    try{ 
     objectMapper.readTree(json); 
     return Optional.empty(); 
    } catch(JsonProcessingException e){ 
     return Optional.of(e); 
    } catch(IOException e) { 
     throw new RuntimeException(e); 
    } 
} 

然後你就可以使用這個方法是這樣的:

jsonHelper.validateJson(mappingData.getMetadataJson()) 
        .map(e -> String.format("Error: %s at %s", e.getMessage(), e.getLocation().toString())) 
        .orElse("Valid JSON");