生の弦があります。文字列が有効なJSONかどうかを検証したいだけです。JSON.NETを使用しています。
生の弦があります。文字列が有効なJSONかどうかを検証したいだけです。JSON.NETを使用しています。
回答:
コードを通じて:
あなたの最善の策は、内部で解析を使用し、解析try-catch
が失敗した場合に例外をキャッチすることです。(私はどのTryParse
方法も知りません)。
(JSON.Netを使用)
最も簡単な方法は、になりますParse
使用して、文字列JToken.Parse
、および、文字列で始まるかどうかを確認し{
たり[
して終了し}
たり]
、それぞれ(本から追加の答え):
private static bool IsValidJson(string strInput)
{
if (string.IsNullOrWhiteSpace(stringValue)) { 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;
}
}
その理由は、のためのチェックを追加し{
たり[
などという事実に基づいていた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文字列の間違いを見つけようとしている場合、私は個人的に利用可能なオンラインツールを使用することを好みます。私が通常行うことは次のとおりです。
JToken.Parse("1234")
!文字列が[
またはで始まる場合は、最初に確認することをお勧めし{
ます。別の選択肢は、使用JObject.Parse()
とJArray.Parse()
です。
JToken.Parse("{a:1}")
んではない、これは無効なJSONであっても例外をスロー- a
引用符で囲む必要があります(stackoverflow.com/q/949449/3116322)
JContainer.Parse(str)
メソッドを使用して、strが有効なJsonかどうかを確認します。これが例外をスローする場合、それは有効なJsonではありません。
JObject.Parse
-文字列が有効なJsonオブジェクト
JArray.Parse
かどうかの確認に使用できます-文字列が有効なJson配列
JContainer.Parse
かどうかの確認に使用できます-Jsonオブジェクトと配列の両方の確認に使用できます
JContainer.Parse("1234");
。
ハビブの答えに基づいて、拡張メソッドを書くことができます:
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(s);
次のtrue
場合でも戻りますJToken.Parse(123);
true
これが無効な場合の戻りJSON
:{A:{"B": 1}}
@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;
}
{ name : "l am invalid JSON" }
トムビーチの回答について 代わりに私は次のことを思いつきました:
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);
}
string
、この答えは本当にa)ここにないか、またはb)「トムビーチの答えを使用しました」this
、すなわち、それの延長部材せずに) -この答えの両方と参照される1つは、同一の簡潔さと弱さを持っています。この点を指摘する必要がある場合は、他の回答にコメントを付けてください。
JToken.Type
解析が成功した後に利用できます。これを使用して、上記の回答のプリアンブルの一部を削除し、結果をより細かく制御するための洞察を提供できます。完全に無効な入力(たとえば、"{----}".IsValidJson();
例外がスローされます)。
public static bool IsValidJson(this string src)
{
try
{
var asToken = JToken.Parse(src);
return asToken.Type == JTokenType.Object || asToken.Type == JTokenType.Array;
}
catch (Exception) // Typically a JsonReaderException exception if you want to specify.
{
return false;
}
}
Json.NetリファレンスJToken.Type
:https : //www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htm
以下は、Habibの回答に基づくTryParse拡張メソッドです。
public static bool TryParse(this string strInput, out JToken output)
{
if (String.IsNullOrWhiteSpace(strInput))
{
output = null;
return false;
}
strInput = strInput.Trim();
if ((strInput.StartsWith("{") && strInput.EndsWith("}")) || //For object
(strInput.StartsWith("[") && strInput.EndsWith("]"))) //For array
{
try
{
output = JToken.Parse(strInput);
return true;
}
catch (JsonReaderException jex)
{
//Exception in parsing json
//optional: LogError(jex);
output = null;
return false;
}
catch (Exception ex) //some other exception
{
//optional: LogError(ex);
output = null;
return false;
}
}
else
{
output = null;
return false;
}
}
使用法:
JToken jToken;
if (strJson.TryParse(out jToken))
{
// work with jToken
}
else
{
// not valid json
}
私はこれを使っています:
internal static bool IsValidJson(string data)
{
data = data.Trim();
try
{
if (data.StartsWith("{") && data.EndsWith("}"))
{
JToken.Parse(data);
}
else if (data.StartsWith("[") && data.EndsWith("]"))
{
JArray.Parse(data);
}
else
{
return false;
}
return true;
}
catch
{
return false;
}
}