我正在尝试使用JsonPath for .NET(http://code.google.com/p/jsonpath/downloads/list),我无法找到如何解析Json字符串和JsonPath字符串的示例得到一个结果.
有没有人用过这个?
Ric*_*key 25
您遇到的问题是JsonPath的C#版本不包含Json解析器,因此您必须将其与另一个处理序列化和反序列化的Json框架一起使用.
JsonPath的工作方式是使用一个名为IJsonPathValueSystem遍历解析的Json对象的接口.JsonPath附带了一个内置函数,BasicValueSystem它使用IDictionary接口来表示Json对象,并使用IList接口来表示Json数组.
您可以BasicValueSystem通过使用C#集合初始化程序构建它们来创建自己的兼容Json对象,但是当您的Json以远程服务器中的字符串形式进入时,这没什么用处.
因此,如果只有您可以获取Json字符串并将其解析为IDictionary对象,IList数组和原始值的嵌套结构,则可以使用JsonPath对其进行过滤!幸运的是,我们可以使用具有良好序列化和反序列化功能的Json.NET来完成这部分工作.
不幸的是,Json.NET没有将Json字符串反序列化为与BasicValueSystem.兼容的格式.因此,使用JsonPath和Json.NET的第一个任务是编写一个JsonNetValueSystem实现IJsonPathValueSystem并理解生成的JObject对象,JArray数组和JValue值的任务JObject.Parse.
所以下载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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在有了这三个部分,我们可以编写一个示例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"": ""J. R. R. 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();
}
}
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"]
Run Code Online (Sandbox Code Playgroud)
此示例基于JsonPath站点上的Javascript示例:
| 归档时间: |
|
| 查看次数: |
19526 次 |
| 最近记录: |