2011-02-17 94 views
4

我有一些JSON发送到我的webservice,看起来像这样。.Net Linq to JSON与Newtonsoft JSON库

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

说我想回到的val的值,其中key等于"dataid"。我如何使用JSON.Net库来做到这一点?

我知道我可以遍历值来找到它,但很可能该对象将比这里的示例更大。

在此先感谢

+0

钥匙是唯一的吗? – CodesInChaos 2011-02-17 19:14:59

+0

@CodeInChaos - 是的,他们是。 – CResults 2011-02-17 19:19:18

回答

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"]); 
    } 
} 
+0

感谢乔恩 - 真的很感激。 – CResults 2011-02-17 19:13:10

7

乔恩打我给它,但这里是这样做的另一种方式:略多LINQ-Y

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 to JSON,请去掉魔术字符串。