私は生の文字列を持っています。文字列が有効な JSON かどうかを検証したいだけです。JSON.NETを使用しています。
12 に答える
コードを通して:
あなたの最善の策は、解析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.Parse
JArray.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 を使用して逆シリアル化します。
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!
}
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;
}