我正在尝试使用JacksonJSON取一个字符串,并确定它是否是有效的JSON。有人能建议一个代码样本使用(Java)吗?
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; }
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。
JsonProcessingException
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; }
dhxwm5r44#
我建议单独使用Bean Validation API:也就是说,首先将数据绑定到POJO,然后验证POJO。在我看来,数据格式级别Schema不是很有用:人们通常仍然需要验证更高层次的关注点,而模式语言本身是笨拙的,特别是那些使用被验证格式的语言(XML模式和JSON模式都有这个基本缺陷)。2这样做会使代码更加模块化,可重用,并分离关注点(序列化,数据验证)。但我实际上会更进一步,建议您看一看DropWizard--它集成了Jackson和Validation API实现(来自Hibernate项目)。
ifsvaxew5#
private boolean isValidJson(String json) { try { objectMapper.readTree(json); } catch (JsonProcessingException e) { return false; } return true; }
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");
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; }
7条答案
按热度按时间xnifntxz1#
不确定您的用例是什么,但应该可以:
ql3eal8s2#
虽然Perception的答案可能会满足许多需求,但它无法捕捉到一些问题,其中之一是重复的密钥,请考虑以下示例:
作为补充,您可以使用以下代码检查重复键:
它在出现重复键或其他错误时抛出
JsonProcessingException
。kb5ga3dv3#
对于Jackson,我使用以下函数:
dhxwm5r44#
我建议单独使用Bean Validation API:也就是说,首先将数据绑定到POJO,然后验证POJO。在我看来,数据格式级别Schema不是很有用:人们通常仍然需要验证更高层次的关注点,而模式语言本身是笨拙的,特别是那些使用被验证格式的语言(XML模式和JSON模式都有这个基本缺陷)。2这样做会使代码更加模块化,可重用,并分离关注点(序列化,数据验证)。
但我实际上会更进一步,建议您看一看DropWizard--它集成了Jackson和Validation API实现(来自Hibernate项目)。
ifsvaxew5#
5ssjco0h6#
另一种选择是在Java8中使用java.util.Optional。这允许返回一个对象,并在调用代码中使用一种功能更强大的方法。
这是另一种可能的实现方式:
然后,您可以按如下方式使用此方法:
6yoyoihd7#
改进其他答案