我有一个原始字符串。我只是想验证字符串是否是有效的JSON。我正在使用JSON.NET。
答案 0 :(得分:153)
通过代码:
最好的办法是在try-catch
内使用解析,并在解析失败的情况下捕获异常。 (我不知道任何TryParse
方法)。
(使用JSON.Net)
最简单的方法是使用JToken.Parse
Parse
字符串,并检查字符串是以{
还是[
开头,以}
结尾或]
分别为(从此answer添加):
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"
或{{1}等值的事实作为有效的令牌。另一种选择可能是在解析时同时使用"'a string'"
和JObject.Parse
,看看其中是否有人成功,但我认为检查JArray.Parse
和{}
应该更容易。< / em> (感谢@RhinoDevel pointing它出来了)
没有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());
}
在包管理器控制台上通过Nuget包管理器安装System.Json
(取自here)
非代码方式:
通常,当有一个小的json字符串并且你试图在json字符串中发现错误时,我个人更喜欢使用可用的在线工具。我通常做的是:
答案 1 :(得分:26)
使用JContainer.Parse(str)
方法检查str是否是有效的Json。如果这会引发异常,则它不是有效的Json。
JObject.Parse
- 可用于检查字符串是否是有效的Json对象
JArray.Parse
- 可用于检查字符串是否是有效的Json数组
JContainer.Parse
- 可用于检查Json对象和&amp;阵列
答案 2 :(得分:11)
根据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!
}
答案 3 :(得分:7)
只是为@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;
}
}
答案 4 :(得分:5)
我发现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 :(得分:2)
关于Tom Beech的回答;我想出了以下内容:
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);
}
答案 6 :(得分:2)
使用System.Text.Json
对于.Net Core,也可以使用System.Text.Json
命名空间并使用JsonDocument
进行解析。示例是基于名称空间操作的扩展方法:
public static bool IsJsonValid(this string txt)
{
try { return JsonDocument.Parse(txt) != null; } catch {}
return false;
}
答案 7 :(得分: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;
}
}
JToken.Type
的Json.Net参考:https://www.newtonsoft.com/json/help/html/T_Newtonsoft_Json_Linq_JTokenType.htm
答案 8 :(得分:0)
此方法不需要外部库
using System.Web.Script.Serialization;
bool IsValidJson(string json)
{
try {
var serializer = new JavaScriptSerializer();
dynamic result = serializer.DeserializeObject(json);
return true;
} catch { return false; }
}
答案 9 :(得分:0)
这是一种基于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
}
答案 10 :(得分:0)
我正在使用这个:
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;
}
}