Java中可靠的JSON字符串validation器

我需要一些可靠的JSON字符串validation器提供帮助 – 这是一种吸收字符串并检查它是否是有效JSON的方法。 例如:如果我通过{"color":"red"}{"amount":15}它会通过,但"My invalid json"类的东西不会通过。 简而言之,我需要一些像www.jsonlint.comvalidation器一样可靠的东西。 顺便说一句 – 我对反序列化为java对象不感兴趣,因为这不是我的要求。 我可能会收到一个任意字符串,我所要做的就是validation它是否具有有效的JSON格式。

我已经在这个论坛上研究过几个关于java JSON字符串validation的post。

到目前为止我做了什么:

我尝试以下列方式使用这些类: org.json.JSONObjectorg.json.JSONArray

 private static boolean isValidJSONStringObject(String requestBody){ try { new JSONObject(requestBody); } catch (JSONException jsonEx) { return false; } return true; } private static boolean isValidJSONStringArray(String requestBody) { try { new JSONArray(requestBody); } catch (JSONException jsonEx) { return false; } return true; } 

但是,以下字符串(整行)仍然存在,它们不应该:

 {"color":"red"}{"var":"value"} [1,2,3][true,false] 

换句话说,当我有一些对象/数组重复w / out某些父对象中的任何封装时。 如果您将这些行粘贴到www.jsonlint.comvalidation器中,它们都会失败。

我知道总有一个正则表达式选项,但由于JSON的递归性质而无法100%保证,因为这些正则表达式将会相当复杂。

任何帮助将不胜感激!

Gson可以解决这个问题。 这是一个例子:

 public boolean isValid(String json) { try { new JsonParser().parse(json); return true; } catch (JsonSyntaxException jse) { return false; } } String json = "{\"color\":\"red\"}{\"var\":\"value\"}"; System.out.println(isValid(json)); 

请注意,Gson确实允许输入JSON的一些宽大处理,这可能是不可取的。 例如,解析器会自动将未加引号的键转换为引用的键。 根据您的预期用途,这可能是也可能不是交易破坏者。

这是我们现在的解决方案。 使用两个不同的库(gson – 第一个私有方法和jackson – 第二个私有方法)并不理想,但至少我们通过了所有的单元/集成测试。 我敢打赌,只需使用jackson工具,我们就可以做到所有需要。

 public static boolean isStringValidJSON(String jsonString) { return (isJSONStringObjectOrArray(jsonString) && isJSONStringParsable(jsonString)); } private static boolean isJSONStringObjectOrArray(String jsonString) { try { JsonElement element = new JsonParser().parse(jsonString); return (element.isJsonObject() || element.isJsonArray()); } catch (JsonSyntaxException jsonEx) { return false; } } private static boolean isJSONStringParsable(String jsonString) { try { org.codehaus.jackson.JsonParser parser = new ObjectMapper().getJsonFactory().createJsonParser(jsonString); while(parser.nextToken() != null) { } return true; } catch (JsonParseException e) { return false; } catch (IOException e) { return false; } } 

在此粘贴您的字符串。 查看输出。

编辑:

上面的链接不再起作用, 这是一个很好的选择。