如何确保使用JSON.NET的string是有效的JSON
我有一个原始的string。 我只是想validationstring是否是有效的JSON。 我正在使用JSON.NET。
通过代码:
最好的办法是在parsing失败的情况下使用try-catch
parsing并捕获exception。 (我不知道任何TryParse
方法) 。
(使用JSON.Net)
最简单的方法是使用JToken.Parse
Parse
string,并检查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; } }