10

我需要一些可靠的 JSON 字符串验证器的帮助 - 一种接收字符串并检查它是否是有效 JSON 的方法。示例:如果我通过{"color":"red"}{"amount":15}它将通过但类似的东西"My invalid json"不会。简而言之,我需要像 www.jsonlint.com 验证器一样可靠的东西。顺便说一句 - 我对反序列化为 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%,而且这些正则表达式将相当复杂。

任何帮助将不胜感激!

4

3 回答 3

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 进行一些宽大处理,这可能不是我们所希望的。例如,解析器会自动将不带引号的键转换为带引号的键。根据您的预期使用情况,这可能会或可能不会破坏交易。

于 2013-04-03T15:52:26.600 回答
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;
    }
}
于 2013-04-04T16:58:23.290 回答
-3

Paste your string here. See the output.

EDIT:

The link above does not work anymore, this is a good alternative.

于 2013-06-20T18:26:46.497 回答