Java中可靠的JSON字符串验证器

时间:2013-04-03 15:42:51

标签: java json

我需要一些可靠的JSON字符串验证器 - 一种吸收字符串并检查它是否是有效JSON的方法。示例:如果我通过{"color":"red"}{"amount":15},它将会通过,但"My invalid json"之类的内容将不会通过。简而言之,我需要一些像www.jsonlint.com验证器一样可靠的东西。 BTW - 我对反序列化为java对象不感兴趣,因为这不是我的要求。我可能会收到一个任意字符串,我所要做的就是验证它是否有一个有效的JSON格式。

我已经在这个论坛上研究过几个关于java JSON字符串验证的帖子。

到目前为止我做了什么:

我尝试以下列方式使用这些类: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]

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

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

任何帮助将不胜感激!

3 个答案:

答案 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)

粘贴字符串here。见输出。

编辑:

上述链接不再有效,this是一个不错的选择。