.Net Linq到JSON与Newtonsoft JSON库

CRe*_*lts 4 .net linq json json.net

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

{
    root: [
        {
            "key": "foo1",
            "val": "150"
        },
        {
            "key": "foo2",
            "val": "220"
        },
        {
            "key": "foo3",
            "val": "300"
        },
        {
            "key": "dataid",
            "val": "2289"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

假设我想返回valwhere key等于的值"dataid".我如何使用JSON.Net库执行此操作?

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

提前致谢

Jon*_*eet 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"]);
    }
}
Run Code Online (Sandbox Code Playgroud)


Dan*_* T. 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);
Run Code Online (Sandbox Code Playgroud)

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