我正在尝试使用 Jackson JSON 获取一个字符串并确定它是否是有效的 JSON。任何人都可以建议使用代码示例(Java)吗?
问问题
88632 次
7 回答
41
不确定您的用例是什么,但应该这样做:
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;
}
于 2012-04-19T12:04:04.880 回答
23
尽管 Perception 的答案可能会满足许多需求,但它无法捕捉到一些问题,其中之一是重复键,请考虑以下示例:
String json = "{ \"foo\" : \"bar\", \"foo\" : \"baz\" }";
作为补充,您可以使用以下代码检查重复键:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
objectMapper.readTree(json);
它会引发JsonProcessingException
重复键或其他错误。
于 2014-09-25T07:45:22.030 回答
15
对于杰克逊,我使用这个功能:
public static boolean isValidJSON(final String json) throws IOException {
boolean valid = true;
try{
objectMapper.readTree(json);
} catch(JsonProcessingException e){
valid = false;
}
return valid;
}
于 2016-04-19T08:43:43.663 回答
12
我建议单独使用Bean Validation API:即首先将数据绑定到 POJO,然后验证 POJO。数据格式级别的模式在我看来不是很有用:通常仍然需要验证更高级别的关注点,而且模式语言本身很笨拙,尤其是。那些使用正在验证的格式(XML Schema 和 JSON Schema 都有这个基本缺陷)。这样做会使代码更加模块化、可重用并分离关注点(序列化、数据验证)。
但实际上我会更进一步,建议您看看DropWizard——它集成了 Jackson 和 Validation API 实现(来自 Hibernate 项目)。
于 2012-04-19T22:05:52.590 回答
2
private static boolean isValidJson(String json) {
try {
objectMapper.readTree(json);
} catch (JsonProcessingException e) {
return false;
}
return true;
}
于 2020-02-17T22:42:17.387 回答
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");
于 2017-05-20T13:56:00.197 回答
1
改进其他答案
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;
}
于 2019-02-05T22:22:02.907 回答