如何使用Jackson JSON验证JSON

时间:2012-04-19 11:17:54

标签: java json jackson

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

7 个答案:

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