Java 如何使用Jackson JSON验证JSON
我试图使用Jackson JSON获取一个字符串并确定它是否是有效的JSON。有人能推荐一个代码示例来使用(Java)吗?不确定您的用例是什么,但这应该可以做到:Java 如何使用Jackson JSON验证JSON,java,json,jackson,Java,Json,Jackson,我试图使用Jackson JSON获取一个字符串并确定它是否是有效的JSON。有人能推荐一个代码示例来使用(Java)吗?不确定您的用例是什么,但这应该可以做到: public boolean isValidJSON(final String json) { boolean valid = false; try { final JsonParser parser = new ObjectMapper().getJsonFactory() .crea
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;
}
我建议单独使用:即,首先将数据绑定到POJO,然后验证POJO。在我看来,数据格式级别的模式不是很有用:通常还需要验证更高级别的问题,模式语言本身也很笨拙,尤其是那些使用被验证格式的语言(XML模式和JSON模式都有这个基本缺陷)。
这样做可以使代码更加模块化、可重用,并分离关注点(序列化、数据验证)
但实际上我会再向前走一步,建议你看一下——它集成了杰克逊和验证API实现(从Hibernate项目)。
尽管感知的答案可能会满足许多需要,但仍有一些问题无法捕捉,其中之一是重复的键,请考虑下面的例子:
String json=“{\'foo\':\'bar\',\'foo\':\'baz\'”;
作为补充,您可以使用以下代码检查重复的密钥:
ObjectMapper ObjectMapper=new ObjectMapper();
objectMapper.enable(反序列化功能。读取重复树密钥时失败);
readTree(json);
它会对重复键或其他错误抛出
JsonProcessingException
。对于Jackson,我使用以下函数:
public static boolean isValidJSON(final String json) throws IOException {
boolean valid = true;
try{
objectMapper.readTree(json);
} catch(JsonProcessingException e){
valid = false;
}
return valid;
}
另一个选项是在Java8中使用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);
}
}
改善其他答案
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;
}
如何定义JSON是有效的?@Slavus:任何符合JSON语法标准的字符串都是有效的JSON。我们没有定义有效的JSON。我晚了几年,这可能在2012年不可用,但您是否在考虑?getJsonFactory()已被弃用。这里提供了简短而优雅的解决方案
请尝试{ObjectMapper ObjectMapper=…;JsonNode JsonNode=ObjectMapper.readTree(yourJsonString);}catch(JsonProcessingException e){……}
两种方法都已折旧:getJsonFactory().createJsonParser(json)。使用这个istead:getFactory().createParser(json)我很困惑,因为我在我的信息学研究中了解到“异常应该用于异常情况;您不希望发生的事情。”。。。验证输入并不是很例外。但我当然明白,这是一个有用的解决方案。我用Forify扫描代码。它警告我Json注入ObjectMpper.read。我已经尝试过上述解决方案。但它无法解决这个问题。Dropwizard似乎已经进入了一个新的领域(www.Dropwizard.io),现在它自称为“一个开发操作友好、高性能、RESTful web服务的Java框架”。还没有读过,但它可能仍然集成了Jackson和验证API。不确定您是否需要所有其他功能。是的,DropWizard至今(2016年2月)仍集成了Jackson和验证API。我看不到这些变化的项目,它是相当成熟的在这一点上。您当然可以使用其他绑定库(JAX-RS是高度可插拔的),但作为基线,这两个库可能会保留。@mc20我已经运行了System.out.println(isValidJSON(“{\'foo\':\'bar\'”)代码>并且它工作正常,返回我true
。请重试。isValidJSON(“{\'foo\”:\'bar\'}foo”
将失败。在有效的JSON之后有额外的内容。添加了此映射程序。enable(反序列化功能。跟踪令牌失败);来抓住它。好的,现在我明白你的意思了。EOP-面向异常的编程。这不是一个好模式。我认为objectMapper.readTree(json);
,应该是mapper.readTree(json);
。
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;
}
private static boolean isValidJson(String json) {
try {
objectMapper.readTree(json);
} catch (JsonProcessingException e) {
return false;
}
return true;
}