生の文字列があります。文字列が有効なJSONかどうかを検証したいだけです。 JSON.NETを使用しています。
スルーコード:
最善の方法は、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.Parse
とJArray.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は利用可能なオンラインツールを使用することを好みます。私が通常していることは:
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!
}
@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;
}
}
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;
}
トムビーチの答えについて。代わりに以下を思いつきました。
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);
}
このメソッドは外部ライブラリを必要としません
using System.Web.Script.Serialization;
bool IsValidJson(string json)
{
try {
var serializer = new JavaScriptSerializer();
dynamic result = serializer.DeserializeObject(json);
return true;
} catch { return false; }
}