如何使用Jackson JSONvalidationJSON

我试图使用Jackson JSON取一个字符串并确定它是否是有效的JSON。 任何人都可以建议使用代码示例(Java)?

不确定你的用例是什么,但是应该这样做:

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

虽然Perception的答案可能符合许多需求,但是它有一些问题无法捕获,其中一个是重复键,请考虑以下示例:

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

作为补充,您可以使用以下代码检查重复键:

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

它会在重复键或其他错误上抛出JsonProcessingException

我建议单独使用Bean Validation API :即首先将数据绑定到POJO,然后validationPOJO。 数据格式级别模式在我看来并不是非常有用:通常仍需要validation更高级别的问题,而模式语言本身也是笨拙的,尤其是。 那些使用格式被validation的(XML Schema和JSON Schema都有这个基本缺陷)。 这样做可以使代码更加模块化,可重用,并将问题(序列化,数据validation)分开。

但我实际上更进一步,建议你看看DropWizard – 它集成了Jackson和Validation API实现(来自Hibernate项目)。

使用Jackson我使用此function:

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

另一种选择是在Java 8中使用java.util.Optional。这允许返回一个对象并在调用代码中使用一种更实用的方法。

这是另一种可能的实现:

 public Optional 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");