181

私は生の文字列を持っています。文字列が有効な JSON かどうかを検証したいだけです。JSON.NETを使用しています。

4

12 に答える 12

267

コードを通して:

あなたの最善の策は、解析try-catchに失敗した場合に parse を内部で使用し、例外をキャッチすることです。(私はどのTryParse方法も知りません) .

(JSON.Net を使用)

最も簡単な方法は、Parseを使用して文字列を取得し、文字列が or で始まり、 orで終わるかどうかをそれぞれJToken.Parse確認することです (この回答から追加) :{[}]

private static bool IsValidJson(string strInput)
{
    if (string.IsNullOrWhiteSpace(strInput)) { return false;}
    strInput = strInput.Trim();
    if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
        (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
    {
        try
        {
            var obj = JToken.Parse(strInput);
            return true;
        }
        catch (JsonReaderException jex)
        {
            //Exception in parsing json
            Console.WriteLine(jex.Message);
            return false;
        }
        catch (Exception ex) //some other exception
        {
            Console.WriteLine(ex.ToString());
            return false;
        }
    }
    else
    {
        return false;
    }
}

orなどのチェックを追加する理由は、 が{orなどの値を有効なトークンとして解析する[という事実に基づいていました。もう 1 つのオプションは、解析で and の両方を使用して、それらのいずれかが成功するかどうかを確認することですが、andを確認する方が簡単だと思います。JToken.Parse"1234""'a string'"JObject.ParseJArray.Parse{}[] (指摘してくれてありがとう@RhinoDevel )

JSON.Net なし

次のように、.Net Framework 4.5 System.Json 名前空間を利用できます。

string jsonString = "someString";
try
{
    var tmpObj = JsonValue.Parse(jsonString);
}
catch (FormatException fex)
{
    //Invalid json format
    Console.WriteLine(fex);
}
catch (Exception ex) //some other exception
{
    Console.WriteLine(ex.ToString());
}

(ただし、System.Jsonコマンドを使用して Nuget パッケージ マネージャーを介してインストールする必要があります:PM> Install-Package System.Json -Version 4.0.20126.16343パッケージ マネージャー コンソールで) (ここから取得)

非コードの方法:

通常、小さな json 文字列があり、json 文字列の間違いを見つけようとしている場合、私は個人的に利用可能なオンライン ツールを使用することを好みます。私が通常行うことは次のとおりです。

  • JSONLint The JSON Validatorに JSON 文字列を貼り付けて、有効な JSON かどうかを確認します。
  • 後で正しい JSON をhttp://json2csharp.com/にコピーし、そのテンプレート クラスを生成してから、JSON.Net を使用して逆シリアル化します。
于 2013-02-20T10:46:08.840 に答える
29

Habib の回答に基づいて、拡張メソッドを作成できます。

public static bool ValidateJSON(this string s)
{
    try
    {
        JToken.Parse(s);
        return true;
    }
    catch (JsonReaderException ex)
    {
        Trace.WriteLine(ex);
        return false;
    }
}

次に、次のように使用できます。

if(stringObject.ValidateJSON())
{
    // Valid JSON!
}
于 2015-07-14T10:38:50.323 に答える
10

JToken.Parse が次のような無効な JSON を誤って解析することがわかりました。

{
"Id" : , 
"Status" : 2
}

JSON 文字列をhttp://jsonlint.com/に貼り付けます- これは無効です。

だから私は使用します:

public static bool IsValidJson(this string input)
{
    input = input.Trim();
    if ((input.StartsWith("{") && input.EndsWith("}")) || //For object
        (input.StartsWith("[") && input.EndsWith("]"))) //For array
    {
        try
        {
            //parse the input into a JObject
            var jObject = JObject.Parse(input);

            foreach(var jo in jObject)
            {
                string name = jo.Key;
                JToken value = jo.Value;

                //if the element has a missing value, it will be Undefined - this is invalid
                if (value.Type == JTokenType.Undefined)
                {
                    return false;
                }
            }
        }
        catch (JsonReaderException jex)
        {
            //Exception in parsing json
            Console.WriteLine(jex.Message);
            return false;
        }
        catch (Exception ex) //some other exception
        {
            Console.WriteLine(ex.ToString());
            return false;
        }
    }
    else
    {
        return false;
    }

    return true;
}
于 2016-04-26T06:38:41.000 に答える