10

信頼できる JSON 文字列バリデーター (文字列を取り込んで、それが有効な JSON かどうかをチェックするメソッド) に助けが必要です。例: 私が合格した{"color":"red"}場合、または{"amount":15}それは合格しますが、そうで"My invalid json"はないようなものです。要するに、www.jsonlint.com バリデータと同じくらい信頼できるものが必要です。ところで-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% を保証することはできず、それらの正規表現はかなり複雑になると思います。

どんな助けでも大歓迎です!

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

これが今のところの解決策です。2 つの異なるライブラリ (gson - 最初のプライベート メソッドと jackson - 2 番目のプライベート メソッド) を使用することは理想的ではありませんが、少なくともすべてのユニット/統合テストに合格しています。ジャクソンのツールだけで、必要なことはすべてできるはずです。

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

ここに文字列を貼り付けます。出力を参照してください。

編集:

上記のリンクはもう機能しません。これは良い代替手段です。

于 2013-06-20T18:26:46.497 に答える