2012-03-02 48 views
2

我已經成功地反序列化在C#這個JSON字符串的,但不能從嵌套在數組中的對象提取值:JSON反序列化:如何獲取值出對象的JSON數組

JavaScriptSerializer js = new JavaScriptSerializer(); 

string json = 
    {"key":"1234","status":"ok","members": 
     [{"id":7,"name":"Joe"}, 
    {"id":2,"name":"Robert"}, 
    {"id":18,"name":"Tim"} 
     ] 
    } 

var d = js.Deserialize <dynamic> (json); 

string _key = d["key"]; // this works 

Array _members = d["members"]; // this works, length = 3 

但我無法提取出來的名字,例如對象的值,這是不對的,但本質上我想

_members [0] [「名稱」]或_members [0]。名稱

我想,解串器,使陣列的字典裏面的對象,但我想我清米伊辛東西...

+0

結帳以下links..http://stackoverflow.com/questions/7482822/json-in-net-c-csharp-getting-values-out-of對象,http://www.json.org/ – MethodMan 2012-03-02 00:34:49

+0

KeyValuePair迭代看起來很有前途,但我無法深入到使用它的{}對象。 – brnwdrng 2012-03-02 00:59:22

回答

12

我建議使用Json.NET做你正在做的事情。下面的代碼做你想要的:

JObject jObject = JObject.Parse(json); 
    JToken memberName = jObject["members"].First["name"]; 
    Console.WriteLine(memberName); // Joe 

通過LINQ to Json

更新:

var js = new JavaScriptSerializer(); 
    var d = js.Deserialize<dynamic>(json); 
    Console.WriteLine(d["members"][0]["name"]); // Joe 

也能正常工作。

+0

不是一個選項... – brnwdrng 2012-03-02 01:23:02

+0

+1更新後的示例。 – meklarian 2012-03-05 19:40:14

2

你是在語法上相當接近。這裏的關鍵是d["members"]Object[]/object[]。而不是Array,你可以使用dynamic[],一切正常。

還要注意的是,即使這樣的聲明是不明確的必要,如圖DPeden的最新樣本。

這是給你更新的代碼段的代碼(我用一個控制檯應用程序來測試):

JavaScriptSerializer js = new JavaScriptSerializer(); 
dynamic d = js.Deserialize<dynamic>(json); 

string key = d["key"]; 
string status = d["status"]; 
dynamic[] members = d["members"]; 

Console.WriteLine("key = {0}", key); 
Console.WriteLine("status = {0}", status); 

Console.WriteLine("members.length = {0}", members.Length); 
Console.WriteLine("members type name = {0}", members.GetType().Name); 
Console.WriteLine("d[\"members\"] type name = {0}", d["members"].GetType().Name); 

這裏是額外的代碼顯示陣列和成員訪問。

Console.WriteLine("--"); 

for (int i = 0; i < members.Length; i++) 
{ 
    Console.WriteLine("members[{0}][\"id\"] = {1}", i, members[i]["id"]); 
    Console.WriteLine("members[{0}][\"name\"] = {1}", i, members[i]["name"]); 
} 

Console.WriteLine("--"); 

Console.WriteLine("{0}", d["members"][0]["id"]); 
Console.WriteLine("{0}", d["members"][0]["name"]); 

Console.ReadKey(); 
+0

您如何獲得'members [i] [「name」]'的字符串值? – 2013-05-31 19:32:49

+1

如果有任何機會名稱爲空,那麼你就必須做:'對象o = d [ 「成員」] [I] [ 「名稱」];'' 字符串名稱= NULL == 2 O null:(string)o;',但否則,'(string)(d [「members」] [i] [「name」])'作品 – meklarian 2013-05-31 20:30:47

+1

謝謝,我最終得到了'Convert.ToString(bla)'工作。謝謝回覆! – 2013-05-31 20:55:20

0

這是一個有點晚了一個答案,但我一直在試圖弄清楚這一點,我想我應該張貼我的地方,什麼工作。

我想用這樣的foreach:

foreach (var member in json["members"]) 
    { 
     Console.WriteLine(member["name"]); 
    } 

順便說一句,(在我的項目的一些原因等),如果你有嵌套陣列,例如

string json = 
{"key":"1234","status":"ok", 
"members":[ 
    {"items"[ 
     {"id":7,"name":"Joe"}, 
     {"id":2,"name":"Robert"}, 
     {"id":18,"name":"Tim"} 
    ]} 
]} 

然後:

foreach (var member in json["members"]) 
    { 
     foreach (var item in member["items"]) 
     { 
      Console.WriteLine(item["name"]); 
     } 
    }