2013-04-03 4 views
9

信頼できるJSON文字列バリデーターは、有効なJSONであるかどうかを確認するためのものです。例:{"color":"red"}または{"amount":15}を渡すと、それは合格しますが、"My invalid json"のようなものは受け付けません。要するに、私はwww.jsonlint.comバリデータと同じくらい信頼できるものが必要です。 BTW - 私はJavaオブジェクトにデシリアライズすることに興味がありません。なぜならそれは私の必要条件ではないからです。任意の文字列を受け取る可能性があり、有効なJSON形式を持つことを検証するだけです。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; 
} 

、以下の文字列(行全体が)まだ通過し、私はオブジェクト/配列がいくつかの親オブジェクト内にカプセル化されていない場合、他の言い方をすればいいです。これらの行をwww.jsonlint.comバリデーターに貼り付けると、両方とも失敗します。

いつも正規表現オプションがあることは知っていますが、JSONの再帰的性質のために100%保証されないことがあります。正規表現はかなり複雑になります。

ご協力いただきますようお願い申し上げます。

+0

他のライブラリを試しましたか?私はジャクソンがそれを許さないと思う。 – yshavit

+1

''私の無効なjson "は実際には有効なJSON文字列であるため、無効なJSONの悪い例です。 – pfyod

答えて

6

Gsonがこれを処理できます。 Gsonを希望されない場合があります入力JSONでいくつかの寛大さを、許可しないこと

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)); 

注:ここでは一例です。たとえば、引用符で囲まれていないキーは、パーサによって自動的に引用符付きのキーに変換されます。これは、あなたの期待される使用状況に応じて、ディール・ブレーカーとなることもあれば、そうでないこともあります。

+1

デシリアライズしようとしているオブジェクトのタイプがわからない限り、Jacksonライブラリはこれを処理していないようです。このGsonライブラリは優れていますが、少し寛大です。たとえば、エラーを投げるのではなく、 'abc'を' 'abc''に変換します。しかし、 '.isJsonObject()'( 'JsonElement'のメソッド)に受け入れ可能なものを制限すれば、うまくいきます。 – Allan

+1

@Allan - Jackson *** ***は、(例えば 'readTree'メソッドの1つを使って)終了オブジェクト型なしでJSONを解析できます。しかし、(デフォルトでは)無効なJSONが確実に返されるわけではありません。Gsonの寛容モードはいくつかの点でソフトで、最新のバグ修正は明らかに行われていません。フィードバックいただきありがとうございます、私は私の答えを更新しました。 – Perception

+0

はい、gsonパーサの「ソフト寛容モード」を前提として、私たちは(今のところは)ジャクソンパーサーを補完してすべての要件を満たすことを決めました。 – rich

3

ここに私たちの解決策があります。 2つの異なるライブラリ(gson-first privateメソッドとjackson-second privateメソッド)を使用するのは理想的ではありませんが、少なくとも、すべてのユニット/統合テストに合格しています。私は、ジャクソンのツールだけで、必要なすべてをやることができると確信しています。

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; 
    } 
} 
-3

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

EDIT:

上記のリンクはthisが良い代替で、もう動作しません。

+2

OPはこれをプログラム的に実行しようとしています。ツールではありません。 – SMR

関連する問題