.Net Linq到JSON与Newtonsoft JSON库

时间:2011-02-17 18:47:11

标签: .net json linq json.net

我有一些JSON发送到我的webservice,看起来像这样。

{
    root: [
        {
            "key": "foo1",
            "val": "150"
        },
        {
            "key": "foo2",
            "val": "220"
        },
        {
            "key": "foo3",
            "val": "300"
        },
        {
            "key": "dataid",
            "val": "2289"
        }
    ]
}

我想要返回val的值key等于"dataid"。我如何使用JSON.Net库?

我知道我可以遍历这些值来找到它但是这个对象可能比这个例子要大得多。

提前致谢

2 个答案:

答案 0 :(得分:18)

某些东西必须在某个时刻循环。如果你需要从同一个JSON中按键获取大量值,你应该从它构建一个Dictionary<string, string> - 这意味着循环一次(显式或使用LINQ ToDictionary方法)但是然后之后快速访问。

以下是一些示例代码:

using System;
using System.IO;
using System.Linq;

using Newtonsoft.Json.Linq;

class Test
{
    static void Main()
    {
        string text = File.ReadAllText("test.json");
        JObject obj = JObject.Parse(text);
        JArray root = (JArray) obj["root"];

        var dictionary = root.ToDictionary(x => (string) x["key"],
                                           x => (string) x["val"]);

        Console.WriteLine(dictionary["dataid"]);
    }
}

答案 1 :(得分:7)

乔恩打败了我,但这是另一种方式:

var json = File.ReadAllText("data.json");
var jobject = JObject.Parse(json);

var item = jobject.Property("root")
                  .Values()
                  .Single(x => x.Value<string>("key") == "foo1");

var value = item.Value<string>("val");

Console.WriteLine(value);

稍微多一点LINQ-y,但如果你使用LINQ to JSON,就没有办法真正摆脱魔法字符串。