web-dev-qa-db-ja.com

JSON.NETを使用して文字列が有効なJSONであることを確認する方法

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

106
user960567

スルーコード:

最善の方法は、try-catch内で解析を使用し、解析に失敗した場合に例外をキャッチすることです。 TryParseメソッドを認識していません)

(JSON.Netを使用)

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

private static bool IsValidJson(string strInput)
{
    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;
    }
}

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

JSON.Netなし

.Net framework 4.5 System.Json namespace を利用できます:

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をインストールする必要があります)here から取得)

非コードの方法:

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

  • JSON文字列を JSONLint The JSON Validator に貼り付け、有効なJSONかどうかを確認します。
  • 後で正しいJSONを http://json2csharp.com/ にコピーし、そのテンプレートクラスを生成してから、JSON.Netを使用してデシリアライズします。
158
Habib

JContainer.Parse(str)メソッドを使用して、strが有効なJsonであるかどうかを確認します。これが例外をスローする場合、有効なJsonではありません。

JObject.Parse-文字列が有効なJsonオブジェクトかどうかを確認するために使用できます
JArray.Parse-文字列が有効なJson配列であるかどうかを確認するために使用できます
JContainer.Parse-Jsonオブジェクトと配列の両方を確認するために使用できます

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!
}
12
Tom Beech

@Habibの回答に何かを追加するために、指定されたJSONが有効なタイプのものであるかどうかを確認することもできます。

public static bool IsValidJson<T>(this string strInput)
{
    strInput = strInput.Trim();
    if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
        (strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
    {
        try
        {
            var obj = JsonConvert.DeserializeObject<T>(strInput);
            return true;
        }
        catch // not valid
        {             
            return false;
        }
    }
    else
    {
        return false;
    }
}
7
Jalal

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;
        }
5
Andrew Roberts

トムビーチの答えについて。代わりに以下を思いつきました。

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

以下を使用します。

if (ValidateJSON(strMsg))
{
    var newGroup = DeserializeGroup(strMsg);
}
2
HappyCoding

このメソッドは外部ライブラリを必要としません

using System.Web.Script.Serialization;
bool IsValidJson(string json)
    {
        try {
            var serializer = new JavaScriptSerializer();
            dynamic result = serializer.DeserializeObject(json);
            return true;
        } catch { return false; }
    }
0
MostafaZ4