web-dev-qa-db-ja.com

特定の文字列がJavaで有効なJSONであるかどうかを確認する方法

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

129
sappu

ワイルドなアイデア、それを解析して、例外をキャッチしてみてください:

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実装を使用します githubでmavenで 、および部分的に Androidで

237
MByD

JACKSON Library

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(VALID_JSON_STRING); //true
boolean secondStringValid = JSONUtils.isJSONValid(NOT_VALID_JSON_STRING); //false

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

77
JeanValjean

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

import com.google.gson.JsonParser;

JsonParser parser = new JsonParser();
parser.parse(json_string); // throws JsonSyntaxException
14
Cristian

。mayBeJSON(String str)JSONUtils ライブラリで利用できます。

12
npinti

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

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

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

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

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

5
Nicholas Daley
String jsonInput = "{\"mob no\":\"9846716175\"}";//Read input Here
JSONReader reader = new JSONValidatingReader();
Object result = reader.read(jsonInput);
System.out.println("Validation Success !!");

stringtree-jsonライブラリをダウンロードしてください

4
Jamsheer

解析に関するビット:

Json、および実際すべての言語では、grammarを使用します。これは、置換として使用できる一連のルールです。 JSONを解析するには、基本的にこれらの置換を逆に実行する必要があります

Jsonはcontext free grammarです。つまり、オブジェクト/配列を無限にネストでき、jsonは引き続き有効です。正規表現は通常の文法(名前の「正規表現」)のみを処理します。これは、無限のネストを許可しないコンテキストフリーの文法のサブセットであるため、すべての有効な構文解析に正規表現のみを使用することはできませんjson。複雑な正規表現とループのセットは、100レベルの深さまで誰も入れ子にしないという前提で使用できますが、それでも非常に困難です。

独自のパーサーを作成する場合
文法を解いた後、再帰降下パーサーを作成できます

2
Austin_Anderson

Kotlinで特定の文字列が有効なJSONかどうかを確認します。 MByD Javaの回答をKotlinに変換しました

fun isJSONValid(test: String): Boolean {
    try {
        JSONObject(test);
    } catch (ex: JSONException) {
        try {
            JSONArray(test);
        } catch (ex1: JSONException) {
            return false;
        }
    }
    return true;
}
1
Bhavesh Hirpara

私見、最もエレガントな方法は、JSON処理用のJava APIを使用することです(JSON-P)、 JSR 374に準拠するJavaEE標準の1つ。

try(StringReader sr = new StringReader(jsonStrn)) {
    Json.createReader(sr).readObject();
} catch(JsonParsingException e) {
    System.out.println("The given string is not a valid json");
    e.printStackTrace();
}

Mavenを使用して、JSON-Pの依存関係を追加します。

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1.4</version>
</dependency>

詳細については、 JSON-P公式ページ をご覧ください。

1
Domenico

Playframework 2.6を使用すると、Java APIにあるJsonライブラリを使用して、単純に文字列を解析することもできます。文字列は、json配列のjson要素のいずれかです。ここでは戻り値は重要ではないため、解析エラーをキャッチして、文字列が正しいJSON文字列であるかどうかを判断します。

    import play.libs.Json;

    public static Boolean isValidJson(String value) {
        try{
            Json.parse(value);
            return true;
        } catch(final Exception e){
            return false;
        }
    }
1
Baah

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

1
talnicolas
import static net.minidev.json.JSONValue.isValidJson;

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

0
Jason

gson ライブラリを使用した厳密なJSON解析の動作例を次に示します。

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

GSONを使用してJSONがJavaで有効かどうかを確認する方法 のその他の詳細な回答も参照してください。

0
Vadzim

javax.jsonライブラリを使用したソリューション:

import javax.json.*;

public boolean isTextJson(String text) {
    try {
        Json.createReader(new StringReader(text)).readObject();
    } catch (JsonException ex) {
        try {
            Json.createReader(new StringReader(text)).readArray();
        } catch (JsonException ex2) {
            return false;
        }
    }
    return true;
}
0
yper
public static boolean isJSONValid(String test) {
    try {
        isValidJSON(test);
        JsonFactory factory = new JsonFactory();
        JsonParser parser = factory.createParser(test);
        while (!parser.isClosed()) {
            parser.nextToken();
        }
    } catch (Exception e) {
        LOGGER.error("exception: ", e);
        return false;
    }
    return true;
}

private static void isValidJSON(String test) {
    try {
        new JSONObject(test);
    } catch (JSONException ex) {
        try {
            LOGGER.error("exception: ", ex);
            new JSONArray(test);
        } catch (JSONException ex1) {
            LOGGER.error("exception: ", ex1);
            throw new Exception("Invalid JSON.");
        }
    }
}

上記のソリューションは両方のシナリオをカバーしています:

  • 重複キー
  • 引用符の不一致または括弧の欠落など。
0
Shailendra

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

{"outputValueSchemaFormat": ""、 "sortByIndexInRecord":0、 "sortOrder":847874874387209 "descending"} kajhfsadkjh

ご覧のとおり、末尾の文字化け文字があるため、jsonは無効です。しかし、jacksonまたはgsonを使用して上記のjsonを解析しようとすると、有効なjsonの解析済みマップが取得され、ガベージの末尾の文字は無視されます。 JSONの妥当性をチェックするためにパーサーを使用している場合、これは必須のソリューションではありません。

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

PS:この質問は私からの質問と回答でした。

0
iec2011007

私は非常に簡単な解決策を見つけました。

最初にこのライブラリ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
    }

できた楽しい

0
Atif Mehar