如何使用JacksonJSON验证JSON

kh212irz  于 2023-01-14  发布在  其他
关注(0)|答案(7)|浏览(134)

我正在尝试使用JacksonJSON取一个字符串,并确定它是否是有效的JSON。有人能建议一个代码样本使用(Java)吗?

xnifntxz

xnifntxz1#

不确定您的用例是什么,但应该可以:

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;
}
ql3eal8s

ql3eal8s2#

虽然Perception的答案可能会满足许多需求,但它无法捕捉到一些问题,其中之一是重复的密钥,请考虑以下示例:

String json = "{ \"foo\" : \"bar\", \"foo\" : \"baz\" }";

作为补充,您可以使用以下代码检查重复键:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(DeserializationFeature.FAIL_ON_READING_DUP_TREE_KEY);
objectMapper.readTree(json);

它在出现重复键或其他错误时抛出JsonProcessingException

kb5ga3dv

kb5ga3dv3#

对于Jackson,我使用以下函数:

public static boolean isValidJSON(final String json) throws IOException {
    boolean valid = true;
    try{ 
        objectMapper.readTree(json);
    } catch(JsonProcessingException e){
        valid = false;
    }
    return valid;
}
dhxwm5r4

dhxwm5r44#

我建议单独使用Bean Validation API:也就是说,首先将数据绑定到POJO,然后验证POJO。在我看来,数据格式级别Schema不是很有用:人们通常仍然需要验证更高层次的关注点,而模式语言本身是笨拙的,特别是那些使用被验证格式的语言(XML模式和JSON模式都有这个基本缺陷)。2这样做会使代码更加模块化,可重用,并分离关注点(序列化,数据验证)。
但我实际上会更进一步,建议您看一看DropWizard--它集成了Jackson和Validation API实现(来自Hibernate项目)。

ifsvaxew

ifsvaxew5#

private boolean isValidJson(String json) {
    try {
        objectMapper.readTree(json);
    } catch (JsonProcessingException e) {
        return false;
    }
    return true;
}
5ssjco0h

5ssjco0h6#

另一种选择是在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);
    }
}

然后,您可以按如下方式使用此方法:

jsonHelper.validateJson(mappingData.getMetadataJson())
                    .map(e -> String.format("Error: %s at %s", e.getMessage(), e.getLocation().toString()))
                    .orElse("Valid JSON");
6yoyoihd

6yoyoihd7#

改进其他答案

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

相关问题