189

Java で JSON 文字列を検証するにはどうすればよいですか? または、正規表現を使用して解析できますか?

4

20 に答える 20

303

ワイルドなアイデアです。解析して例外をキャッチしてみてください。

import org.json.*;

public boolean isJSONValid(String test) {
    try {
        new JSONObject(test);
    } catch (JSONException ex) {
        // edited, to include @Arthur's comment
        // e.g. in case JSONArray is valid as well...
        try {
            new JSONArray(test);
        } catch (JSONException ex1) {
            return false;
        }
    }
    return true;
}

このコードはorg.json JSON API 実装を使用します。これは githubmaven、および部分的に Androidで利用できます。

于 2012-04-16T13:19:39.590 に答える
119

ジャクソン図書館

1 つのオプションは、Jackson ライブラリを使用することです。最初に最新バージョンをインポートします(現在はそうです):

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.0</version>
</dependency>

次に、次のように正しい答えを実装できます。

import com.fasterxml.jackson.databind.ObjectMapper;

public final class JSONUtils {
  private JSONUtils(){}

  public static boolean isJSONValid(String jsonInString ) {
    try {
       final ObjectMapper mapper = new ObjectMapper();
       mapper.readTree(jsonInString);
       return true;
    } catch (IOException e) {
       return false;
    }
  }
}

Google GSON オプション

もう 1 つのオプションは、Google Gsonを使用することです。依存関係をインポートします。

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.5</version>
</dependency>

ここでも、提案されたソリューションを次のように実装できます。

import com.google.gson.Gson;

public final class JSONUtils {
  private static final Gson gson = new Gson();

  private JSONUtils(){}

  public static boolean isJSONValid(String jsonInString) {
      try {
          gson.fromJson(jsonInString, Object.class);
          return true;
      } catch(com.google.gson.JsonSyntaxException ex) { 
          return false;
      }
  }
}

簡単なテストは次のとおりです。

//A valid JSON String to parse.
String validJsonString = "{ \"developers\": [{ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " +
        "{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}";

// Invalid String with a missing parenthesis at the beginning.
String invalidJsonString = "\"developers\": [ \"firstName\":\"Linus\" , \"lastName\":\"Torvalds\" }, " +
        "{ \"firstName\":\"John\" , \"lastName\":\"von Neumann\" } ]}";

boolean firstStringValid = JSONUtils.isJSONValid(validJsonString); //true
boolean secondStringValid = JSONUtils.isJSONValid(invalidJsonString); //false

リリースで修正される末尾のコンマが原因で、「小さな」問題が発生する可能性があることに注意してください3.0.0

于 2014-04-04T10:18:25.193 に答える
16

Google Gson では、 JsonParserを使用できます。

import com.google.gson.JsonParser;

JsonParser parser = new JsonParser();
parser.parse(json_string); // throws JsonSyntaxException
于 2015-06-09T07:48:08.613 に答える
14

JSONUtilsライブラリで利用可能な.mayBeJSON(String str)を使用できます。

于 2012-04-16T13:19:21.260 に答える
5

それは、検証で何を証明しようとしているかによって異なります。jsonの文法は正規表現だけで表現できるよりも複雑であるため、他の人が示唆したようにjsonを解析することは、正規表現を使用するよりも優れています。

json が Java コードによってのみ解析される場合は、同じパーサーを使用して検証します。

ただし、解析だけでは、他の環境で受け入れられるかどうかは必ずしもわかりません。例えば

  • 多くのパーサーはオブジェクトまたは配列の末尾のコンマを無視しますが、古いバージョンの IE は末尾のコンマにヒットすると失敗する可能性があります。
  • 他のパーサーは、末尾のコンマを受け入れる場合がありますが、その後に未定義/null エントリを追加します。
  • 一部のパーサーは、引用符で囲まれていないプロパティ名を許可する場合があります。
  • 一部のパーサーは、文字列内の非 ASCII 文字に対して異なる反応を示す場合があります。

検証を非常に徹底する必要がある場合は、次のことができます。

于 2014-10-13T11:24:04.420 に答える
4

gsonライブラリを使用した厳密な json 解析の実際の例を次に示します。

public static JsonElement parseStrict(String json) {
    // throws on almost any non-valid json
    return new Gson().getAdapter(JsonElement.class).fromJson(json); 
}

詳細な情報とさまざまな無効な例を含む拡張テストケースを使用して、GSON を使用して Java で JSON が有効かどうかを確認する方法の他の詳細な回答も参照してください。

于 2019-07-05T10:36:42.950 に答える
3

答えは部分的に正しいです。私も同じ問題に直面しました。jsonを解析して例外をチェックするのは通常の方法のようですが、入力jsonのようなソリューションは失敗します

{"outputValueSchemaFormat": "","sortByIndexInRecord": 0,"sortOrder":847874874387209"降順"}kajhfsadkjh

ご覧のとおり、末尾にゴミ文字があるため、json は無効です。ただし、jackson または gson を使用して上記の json を解析しようとすると、有効な json の解析済みマップが取得され、末尾のガベージ文字は無視されます。json の有効性をチェックするためにパーサーを使用している場合、これは必要な解決策ではありません。

この問題の解決策については、こちらを参照してください。

PS: この質問は私が尋ねて回答したものです。

于 2016-08-11T09:32:53.493 に答える
1

ここでは、JSONファイルを検証できるツールを見つけることができます。または、JSONファイルを任意のJSONライブラリで逆シリアル化することもできます。操作が成功した場合は、有効である必要があります(たとえば、入力が入力された場合に例外をスローするgoogle-json解析は有効なJSONではありません)。

于 2012-04-16T13:20:29.387 に答える
0

私はそれに対する非常に簡単な解決策を見つけました。

最初にこのライブラリnet.sf.json-libをインストールしてください。

    import net.sf.json.JSONException;

    import net.sf.json.JSONSerializer;

    private static boolean isValidJson(String jsonStr) {
        boolean isValid = false;
        try {
            JSONSerializer.toJSON(jsonStr);
            isValid = true;
        } catch (JSONException je) {
            isValid = false;
        }
        return isValid;
    }

    public static void testJson() {
        String vjson = "{\"employees\": [{ \"firstName\":\"John\" , \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}";
        String ivjson = "{\"employees\": [{ \"firstName\":\"John\" ,, \"lastName\":\"Doe\" },{ \"firstName\":\"Anna\" , \"lastName\":\"Smith\" },{ \"firstName\":\"Peter\" , \"lastName\":\"Jones\" }]}";
        System.out.println(""+isValidJson(vjson)); // true
        System.out.println(""+isValidJson(ivjson)); // false
    }

終わり。楽しみ

于 2014-05-09T11:16:49.367 に答える
0

以下のコードを試すことができます。

 import org.json.JSONObject;
 import org.json.JSONTokener;

 public static JSONObject parseJsonObject(String substring)
 {
  return new JSONObject(new JSONTokener(substring));
 }
于 2021-02-12T13:08:17.790 に答える
0
import static net.minidev.json.JSONValue.isValidJson;

次に、JSON文字列を渡してこの関数を呼び出します:)

于 2018-09-20T22:05:08.453 に答える