如何确保使用JSON.NET的string是有效的JSON

我有一个原始的string。 我只是想validationstring是否是有效的JSON。 我正在使用JSON.NET。

通过代码:

最好的办法是在parsing失败的情况下使用try-catchparsing并捕获exception。 (我不知道任何TryParse方法)

(使用JSON.Net)

最简单的方法是使用JToken.Parse Parsestring,并检查string是否以{[和以}]结尾(从此答案中添加)

 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; } } 

添加对{[ etc等的检查的原因是基于JToken.Parse将parsing诸如"1234""'a string'"这样的值作为有效标记的事实。 另一个选项可能是在parsing中使用JObject.ParseJArray.Parse ,看看其中的任何一个成功,但我相信检查{}[]应该更容易。 (感谢@RhinoDevel 指出 )

没有JSON.Net

您可以利用.Net框架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()); } 

(但是,你必须通过使用命令: PM> Install-Package System.Json -Version 4.0.20126.16343打包pipe理器控制台上的PM> Install-Package System.Json -Version 4.0.20126.16343 )来通过Nuget软件包pipe理器来PM> Install-Package System.Json -Version 4.0.20126.16343 (取自这里 )

非代码方式:

通常,当有一个小的jsonstring,并且你试图在jsonstring中find一个错误时,我个人更喜欢使用可用的在线工具。 我通常做的是:

使用JContainer.Parse(str)方法来检查str是否是有效的Json。 如果这抛出exception,那么它不是一个有效的Json。

JObject.Parse – 可用于检查string是否为有效的Json对象
JArray.Parse – 可用于检查string是否是有效的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是否来自一个有效的types:

 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错误地parsing了无效的JSON,例如:

 { "Id" : , "Status" : 2 } 

将JSONstring粘贴到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; } }