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

ric*_*ich 9 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;
}
Run Code Online (Sandbox Code Playgroud)

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

{"color":"red"}{"var":"value"}

[1,2,3][true,false]
Run Code Online (Sandbox Code Playgroud)

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

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

任何帮助将不胜感激!

Per*_*ion 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));
Run Code Online (Sandbox Code Playgroud)

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