2012-04-19 32 views
22

Tôi đang cố gắng sử dụng JSON JSON lấy một chuỗi và xác định xem đó có phải là JSON hợp lệ hay không. Bất cứ ai có thể đề nghị một mẫu mã để sử dụng (Java)?Cách xác thực JSON bằng JSON JSON

+1

Làm thế nào để bạn defina rằng JSON là hợp lệ? – Slavus

+1

@Slavus: Bất kỳ chuỗi nào đáp ứng tiêu chuẩn cú pháp JSON là JSON hợp lệ. Chúng tôi không xác định JSON hợp lệ. – Vivek

+0

Tôi trễ năm và điều này có thể không có sẵn trong năm 2012, nhưng bạn có nghĩ đến [lược đồ JSON] (http://json-schema.org/) không? – Stroboskop

Trả lời

27

Không chắc gì trường hợp sử dụng của bạn cho điều này là, nhưng điều này nên làm điều đó:

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() không được chấp nhận. – Arash

+0

Giải pháp ngắn và thanh lịch có sẵn tại đây [Cảm ơn @pdem] (http://stackoverflow.com/a/29414638/452708) 'try { ObjectMapper objectMapper = ...; JsonNode jsonNode = objectMapper.readTree (yourJsonString); } bắt (JsonProcessingException e) {........} ' – Abhijeet

+1

cả hai phương pháp đều bị khấu hao: getJsonFactory(). CreateJsonParser (json). Sử dụng istead này: getFactory(). CreateParser (json) – kiedysktos

10

tôi sẽ khuyên bạn sử dụng Bean Validation API riêng: đó là, dữ liệu ràng buộc đầu tiên vào một POJO, sau đó xác POJO. Các lược đồ mức định dạng dữ liệu theo ý kiến ​​của tôi không phải là rất hữu ích: người ta thường vẫn phải xác nhận các mối quan tâm mức cao hơn, và các ngôn ngữ lược đồ chính là vụng về, đặc biệt. những người sử dụng định dạng được xác nhận hợp lệ (Lược đồ XML và Lược đồ JSON đều có lỗ hổng cơ bản này). Làm điều này làm cho mã có nhiều mô-đun hơn, có thể sử dụng lại và phân tách các mối quan tâm (tuần tự hóa, xác thực dữ liệu).

Nhưng tôi thực sự sẽ tiến xa hơn một bước và đề xuất bạn xem DropWizard - nó tích hợp triển khai API và xác thực API (từ dự án Hibernate).

+0

Dropwizard dường như đã chuyển sang một ngôi nhà mới (www.dropwizard.io) và tự gọi mình là "một khung công tác Java để phát triển web thân thiện, hiệu năng cao, RESTful dịch vụ ".Chưa đọc nhưng nó vẫn có thể tích hợp API của Jackson và Validation. Không chắc chắn nếu bạn cần tất cả phần còn lại. – Wivani

+0

Có, DropWizard vẫn tích hợp API của Jackson và Validation kể từ bây giờ (feb 2016). Tôi không thấy những thay đổi cho dự án, nó khá trưởng thành vào thời điểm này. Tất nhiên bạn có thể sử dụng các thư viện liên kết khác (JAX-RS có khả năng cắm được cao), nhưng như là đường cơ sở, 2 libs này có thể vẫn còn. – StaxMan

12

Mặc dù câu trả lời Perception của lẽ sẽ phù hợp với nhiều nhu cầu, có một số vấn đề nó sẽ không nắm bắt, một trong số họ là chìa khóa trùng lặp, hãy xem xét ví dụ sau:

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

Như một sự bổ sung, bạn có thể kiểm tra các khóa trùng lặp có mã sau:

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

Nó ném JsonProcessingException trên khóa trùng lặp hoặc lỗi khác.

7

Với Jackson Tôi sử dụng chức năng này:

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

tùy chọn khác sẽ được sử dụng java.util.Optional trong Java 8. Điều này cho phép để trả lại một đối tượng và sử dụng trong đoạn code gọi một cách tiếp cận chức năng hơn.

Đây là một thực thể:

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); 
    } 
} 

Sau đó, bạn có thể sử dụng phương pháp này như sau:

jsonHelper.validateJson(mappingData.getMetadataJson()) 
        .map(e -> String.format("Error: %s at %s", e.getMessage(), e.getLocation().toString())) 
        .orElse("Valid JSON"); 
Các vấn đề liên quan