42

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

4

7 回答 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 回答