如何使用JsonPath使用C#示例?

我正在尝试使用JsonPath for .NET( http://code.google.com/p/jsonpath/downloads/list ),我无法找到如何解析Json字符串和JsonPath字符串的示例得到一个结果。

有没有人用过这个?

您遇到的问题是JsonPath的C#版本不包含Json解析器,因此您必须将其与另一个处理序列化和反序列化的Json框架一起使用。

JsonPath的工作方式是使用一个名为IJsonPathValueSystem的接口来遍历解析的Json对象。 JsonPath附带了一个内置的BasicValueSystem ,它使用IDictionary接口来表示Json对象,使用IList接口来表示Json数组。

您可以通过使用C#集合初始化程序构建它们来创建自己的与BasicValueSystem兼容的Json对象,但是当您的Json以远程服务器的字符串forms进入时,这没什么用处。

因此,如果只有你可以使用Json字符串并将其解析为IDictionary对象, IList数组和原始值的嵌套结构,那么您可以使用JsonPath对其进行过滤! 幸运的是,我们可以使用具有良好序列化和反序列化function的Json.NET来完成这部分工作。

不幸的是,Json.NET没有将Json字符串反序列化为与BasicValueSystem兼容的格式。 因此,使用JsonPath和Json.NET的第一个任务是编写一个实现IJsonPathValueSystem ,它可以理解JObject.Parse生成的JObject对象, JArray数组和JValue值。

因此,下载JsonPath和Json.NET并将它们放入C#项目中。 然后将此类添加到该项目:

 public sealed class JsonNetValueSystem : IJsonPathValueSystem { public bool HasMember(object value, string member) { if (value is JObject) return (value as JObject).Properties().Any(property => property.Name == member); if (value is JArray) { int index = ParseInt(member, -1); return index >= 0 && index < (value as JArray).Count; } return false; } public object GetMemberValue(object value, string member) { if (value is JObject) { var memberValue = (value as JObject)[member]; return memberValue; } if (value is JArray) { int index = ParseInt(member, -1); return (value as JArray)[index]; } return null; } public IEnumerable GetMembers(object value) { var jobject = value as JObject; return jobject.Properties().Select(property => property.Name); } public bool IsObject(object value) { return value is JObject; } public bool IsArray(object value) { return value is JArray; } public bool IsPrimitive(object value) { if (value == null) throw new ArgumentNullException("value"); return value is JObject || value is JArray ? false : true; } private int ParseInt(string s, int defaultValue) { int result; return int.TryParse(s, out result) ? result : defaultValue; } } 

现在有了这三个部分,我们可以编写一个示例JsonPath程序:

 class Program { static void Main(string[] args) { var input = @" { ""store"": { ""book"": [ { ""category"": ""reference"", ""author"": ""Nigel Rees"", ""title"": ""Sayings of the Century"", ""price"": 8.95 }, { ""category"": ""fiction"", ""author"": ""Evelyn Waugh"", ""title"": ""Sword of Honour"", ""price"": 12.99 }, { ""category"": ""fiction"", ""author"": ""Herman Melville"", ""title"": ""Moby Dick"", ""isbn"": ""0-553-21311-3"", ""price"": 8.99 }, { ""category"": ""fiction"", ""author"": ""JRR Tolkien"", ""title"": ""The Lord of the Rings"", ""isbn"": ""0-395-19395-8"", ""price"": 22.99 } ], ""bicycle"": { ""color"": ""red"", ""price"": 19.95 } } } "; var json = JObject.Parse(input); var context = new JsonPathContext { ValueSystem = new JsonNetValueSystem() }; var values = context.SelectNodes(json, "$.store.book[*].author").Select(node => node.Value); Console.WriteLine(JsonConvert.SerializeObject(values)); Console.ReadKey(); } } 

产生这个输出:

 ["Nigel Rees","Evelyn Waugh","Herman Melville","JRR Tolkien"] 

此示例基于JsonPath站点上的Javascript示例:

  • Javascript用法和示例

对于那些不喜欢LINQ(.NET 2.0)的人:

 namespace JsonPath { public sealed class JsonNetValueSystem : IJsonPathValueSystem { public bool HasMember(object value, string member) { if (value is Newtonsoft.Json.Linq.JObject) { // return (value as JObject).Properties().Any(property => property.Name == member); foreach (Newtonsoft.Json.Linq.JProperty property in (value as Newtonsoft.Json.Linq.JObject).Properties()) { if (property.Name == member) return true; } return false; } if (value is Newtonsoft.Json.Linq.JArray) { int index = ParseInt(member, -1); return index >= 0 && index < (value as Newtonsoft.Json.Linq.JArray).Count; } return false; } public object GetMemberValue(object value, string member) { if (value is Newtonsoft.Json.Linq.JObject) { var memberValue = (value as Newtonsoft.Json.Linq.JObject)[member]; return memberValue; } if (value is Newtonsoft.Json.Linq.JArray) { int index = ParseInt(member, -1); return (value as Newtonsoft.Json.Linq.JArray)[index]; } return null; } public System.Collections.IEnumerable GetMembers(object value) { System.Collections.Generic.List ls = new System.Collections.Generic.List(); var jobject = value as Newtonsoft.Json.Linq.JObject; /// return jobject.Properties().Select(property => property.Name); foreach (Newtonsoft.Json.Linq.JProperty property in jobject.Properties()) { ls.Add(property.Name); } return ls; } public bool IsObject(object value) { return value is Newtonsoft.Json.Linq.JObject; } public bool IsArray(object value) { return value is Newtonsoft.Json.Linq.JArray; } public bool IsPrimitive(object value) { if (value == null) throw new System.ArgumentNullException("value"); return value is Newtonsoft.Json.Linq.JObject || value is Newtonsoft.Json.Linq.JArray ? false : true; } private int ParseInt(string s, int defaultValue) { int result; return int.TryParse(s, out result) ? result : defaultValue; } } } 

用法:

 object obj = Newtonsoft.Json.JsonConvert.DeserializeObject(input); JsonPath.JsonPathContext context = new JsonPath.JsonPathContext { ValueSystem = new JsonPath.JsonNetValueSystem() }; foreach (JsonPath.JsonPathNode node in context.SelectNodes(obj, "$.store.book[*].author")) { Console.WriteLine(node.Value); }