Answers:
通过代码:
最好的选择是在a内使用parse 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());
}
(但是,您必须在Package Manager控制台上System.Json
使用命令:通过Nuget软件包管理器进行安装PM> Install-Package System.Json -Version 4.0.20126.16343
)(从此处获取)
非代码方式:
通常,当有一个小的json字符串,而您试图在json字符串中发现一个错误时,我个人更喜欢使用可用的在线工具。我通常要做的是:
JToken.Parse("1234")
!如果string以[
或开头,则最好先检查一下{
。另一种选择是use JObject.Parse()
和JArray.Parse()
。
使用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);
}
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;
}
}