如何确保使用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.Parse和JArray.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一个错误时,我个人更喜欢使用可用的在线工具。 我通常做的是:
- 在JSONLint中粘贴JSONstringJSONvalidation器 ,看看它是否有效的JSON。
- 稍后将正确的JSON复制到http://json2csharp.com/并为其生成模板类,然后使用JSON.Net对其进行反序列化。;
 使用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; } }