.Net Linq to JSON с библиотекой Newtonsoft JSON

У меня есть JSON, который отправляется на мой веб-сервис, который выглядит примерно так.

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

Скажем, я хотел вернуть значение val, где key равно "dataid". Как мне это сделать с помощью библиотеки JSON.Net?

Я знаю, что могу перебирать значения, чтобы найти его, но вполне вероятно, что объект будет намного больше, чем в этом примере.

заранее спасибо


person CResults    schedule 17.02.2011    source источник
comment
@CodeInChaos - да, они есть.   -  person CResults    schedule 17.02.2011


Ответы (2)


Что ж, в какой-то момент что-то должно пройти через цикл. Если вам нужно получить много значений по ключу из одного и того же 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"]);
    }
}
person Jon Skeet    schedule 17.02.2011
comment
Спасибо Джон - действительно ценю это. - person CResults; 17.02.2011

Джон опередил меня, но вот еще один способ сделать это:

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.

person Daniel T.    schedule 17.02.2011
comment
Спасибо за более LINQ-ответ, Дэн :) - person CResults; 18.02.2011