2012-03-02 4 views
2

Я успешно десериализованный эта JSON строку в C#, но не может извлечь значения из объектов, вложенных в массиве: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] ["name"] или, _members [0] .name

Я думаю, что десериализатор делает объекты внутри словарей массива, но я думаю, что я очищаю m что-то ...

+0

фотографии следующие links..http: //stackoverflow.com/questions/7482822/json-in-net-c-csharp-getting-values-out-of -the-object, http://www.json.org/ – MethodMan

+0

Итерация KeyValuePair выглядит многообещающе, но я не могу спуститься в объекты {}, чтобы использовать ее. – brnwdrng

ответ

12

Я рекомендую использовать Json.NET, чтобы делать то, что вы делаете. Следующий код делает то, что вы хотите:

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

Via LINQ to Json.

Update:

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

Также работает отлично.

+0

Не вариант ... – brnwdrng

+0

+1 на обновленный образец. – meklarian

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 "]'? –

+1

Если есть случайное имя, то вам нужно будет: 'object o = d [" members "] [i] [" name "];' 'string name = null == o? null: (string) o; ', но в противном случае' (string) (d ["members"] [i] ["name"]) 'works – meklarian

+1

Спасибо, я закончил тем, что получил' Convert.ToString (bla) 'to Работа. Спасибо за ответ! –

0

Это немного поздно для ответа, но я пытался понять это и думал, что должен опубликовать где-то то, что сработало для меня.

Я хотел использовать Еогеасп так:

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"]); 
     } 
    } 
Смежные вопросы