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

Nie*_*sma 17 c# jsonpath

我正在尝试使用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示例:

  • 而不是编写大量代码并使用两个库,使用Json.Net不是更容易:JObject json = JObject.Parse(@input); var values = json.SelectToken("store.book").Values("author"); (2认同)