Java 如何使用Jackson JSON验证JSON

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

我试图使用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;
}
我建议单独使用:即,首先将数据绑定到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;
}