Ошибка десериализации JSON: данный ключ отсутствовал в словаре

#c# #.net #json #visual-studio-2015 #deserialization

#c# #.net #json #visual-studio-2015 #десериализация

Вопрос:

Я пытаюсь вывести JSON в выпадающий список в веб-форме. Мне удалось зайти так далеко:

 WebClient client = new WebClient();
string getString = client.DownloadString("http://myfeed.com/app_feed.php");

JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic item = serializer.Deserialize<object>(getString);
string name = item["title"];

return name;
  

Это возвращает канал нормально, но в строке возникает ошибка:

 string name = item["title"];
  

Возвращая эту ошибку:

Дополнительная информация: данный ключ отсутствовал в словаре.

Это образец моего канала:

 {"apps":[{"title":"title1","description":"description1"},    
{"title":"title2","description":"description2"},
{"title":"title3","description":"description3"}
  

Итак, я подумал, что ссылаюсь на первый заголовок, и я планировал перебрать их:

 string name = item["title"];
  

Но, очевидно, нет!
Я просмотрел Stackoverflow, но не могу найти ответ, который я мог бы применить к своему собственному коду.

Комментарии:

1. Только предложение: вместо десериализации вашего JSON в dynamic объект я бы рекомендовал вам создать несколько строго типизированных классов C #, с которыми вы можете работать и выполнять итерации. Вы можете использовать json2csharp.com чтобы помочь вам в этом, или встроенный инструмент в VS > Edit > Paste Special > Paste JSON As Classes 🙂

2. ‘]}’ отсутствует в ленте примеров. это полный канал?

3. Я думаю, что это просто опечатка @Arshad

Ответ №1:

title находится внутри другого ключа apps и является массивом, поэтому вы должны повторить его, я покажу вам, просто выберите первый, используя индекс 0

 string name = item["apps"][0]["title"];
  

вы можете получить доступ ко всем с помощью foreach

 foreach (var ap in item["apps"])
{
    Console.WriteLine(ap["title"]);
}
  

Ответ №2:

Во-первых, ваш JSON недействителен. Второе: вам нужно перебирать свои элементы, так как это массив. Если вы хотите получить доступ к первому, вы могли бы сделать: item["apps"][0]["title"]

Перебор всех элементов:

 var str = @"{""apps"":[{""title"":""title1"",""description"":""description1""},    
{""title"":""title2"",""description"":""description2""},
{""title"":""title3"",""description"":""description3""}]}";

var serializer = new JavaScriptSerializer();
dynamic obj = serializer.Deserialize<object>(str);
foreach (var item in obj["apps"])
{
    Console.WriteLine("item title: "   item["title"]);
}