我需要一些可靠的JSON字符串验证器 - 一种吸收字符串并检查它是否是有效JSON的方法。示例:如果我通过{"color":"red"}
或{"amount":15}
,它将会通过,但"My invalid json"
之类的内容将不会通过。简而言之,我需要一些像www.jsonlint.com验证器一样可靠的东西。 BTW - 我对反序列化为java对象不感兴趣,因为这不是我的要求。我可能会收到一个任意字符串,我所要做的就是验证它是否有一个有效的JSON格式。
我已经在这个论坛上研究过几个关于java JSON字符串验证的帖子。
到目前为止我做了什么:
我尝试以下列方式使用这些类:org.json.JSONObject
和org.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]
换句话说,当我在一些父对象中重复了对象/数组时,没有任何封装。如果您将这些行粘贴到www.jsonlint.com验证器中,它们都会失败。
我知道总有一个正则表达式选项,但由于JSON的递归性质而无法100%保证,因为这些正则表达式将会相当复杂。
任何帮助将不胜感激!
答案 0 :(得分:6)
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进行一些宽大处理,这可能并不理想。例如,解析器会自动将未加引号的键转换为引用的键。根据您的预期用途,这可能是也可能不是交易破坏者。
答案 1 :(得分:3)
这是我们现在的解决方案。使用两个不同的库(gson - 第一个私有方法和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;
}
}
答案 2 :(得分:-3)