我正在尝试使用Jackson JSON获取字符串并确定它是否是有效的JSON。任何人都可以建议使用代码示例(Java)吗?
答案 0 :(得分:33)
不确定您的用例是什么,但是应该这样做:
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;
}
答案 1 :(得分:17)
虽然Perception的答案可能会满足很多需求,但是有一些问题无法解决,其中一个是重复键,请考虑以下示例:
String json = "{ \"foo\" : \"bar\", \"foo\" : \"baz\" }";
作为补充,您可以使用以下代码检查重复的密钥:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
objectMapper.readTree(json);
它会在重复键或其他错误上抛出JsonProcessingException
。
答案 2 :(得分:11)
我建议单独使用Bean Validation API:即首先将数据绑定到POJO,然后验证POJO。数据格式级别模式在我看来并不是非常有用:通常仍需要验证更高级别的问题,而模式语言本身也是笨拙的,尤其是。那些使用格式被验证的(XML Schema和JSON Schema都有这个基本缺陷)。 这样做可以使代码更加模块化,可重用,并将问题分开(序列化,数据验证)。
但我实际上更进了一步,建议你看一下DropWizard - 它集成了Jackson和Validation API实现(来自Hibernate项目)。
答案 3 :(得分:11)
使用Jackson我使用此功能:
public static boolean isValidJSON(final String json) throws IOException {
boolean valid = true;
try{
objectMapper.readTree(json);
} catch(JsonProcessingException e){
valid = false;
}
return valid;
}
答案 4 :(得分:2)
另一种选择是在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");
答案 5 :(得分:1)
private static boolean isValidJson(String json) {
try {
objectMapper.readTree(json);
} catch (JsonProcessingException e) {
return false;
}
return true;
}
答案 6 :(得分:0)
完善其他答案
public static boolean isValidJSON(final String json) throws IOException {
boolean valid = true;
try{
mapper.enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS);
mapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
objectMapper.readTree(json);
} catch(JsonProcessingException e){
valid = false;
}
return valid;
}