2015-04-25 2 views
0

Я пытаюсь получить данные с веб-сайта RSS, преобразующего его в JSON. Я получил эту строку JSON:Array JSON deserialize

http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=http%3A%2F%2Frss.tecmundo.com.br%2Ffeed

Я использую списки, чтобы получить значение, но я получил эту ошибку «Не удается создать экземпляр абстрактного класса или интерфейса», и я не знаю, как решить Это. Это происходит в этой строке.

IList<News> content = new IList<News>(); 

Вот мой код.

public class News 
{ 
    public string author { get; set; } 
    public string title { get; set; } 
    public string content { get; set; } 
    public string contentSnippet { get; set; } 
    public string link { get; set; } 
    public string publishedDate { get; set; } 

    public string[] getFeed(string Website) 
    { 
     string path = @"http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&q=" + Website; 
     var json = new WebClient().DownloadString(path); 
     JObject jsonObject = JObject.Parse((string)json); 

     IList<JToken> jsonData = jsonObject["responseData"]["feed"]["entries"]["0"].Children().ToList(); 
     IList<News> content = new IList<News>(); 

     foreach(JToken data in jsonData) 
     { 
      News finalData1 = JsonConvert.DeserializeObject<News>(jsonData.ToString()); 
      content.Add(finalData1); 
     } 

     return new string[] { "I must return something here." }; 
    } 
} 

Вот инструмент, который я буду использовать для визуализации лучше строку JSON: http://jsonschema.net/#/

ответ

2

Ошибка, которую вы получаете, не имеет ничего общего с JSON. Это связано с тем, что вы пытаетесь создать экземпляр интерфейса. Вы могли просто исправить, дав ей конкретный List<T> класс:

IList<News> content = new List<News>(); 

Однако более простой способ преобразования IList<JToken> к IList<News>, вероятно, снова использовать LINQ - вы можете сделать все это за один шаг довольно легко:

IList<News> content = jsonObject["responseData"]["feed"]["entries"]["0"] 
    .Children() 
    .Select(token => JsonConvert.DeserializeObject<News>(token.ToString()) 
    .ToList(); 

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

JArray array = (JArray) jsonObject["responseData"]["feed"]["entries"]; 
var content = array 
    .Select(token => JsonConvert.DeserializeObject<News>(token.ToString()) 
    .ToList(); 
+0

Я читаю массив JSON по правильному пути? Я имею в виду использование ["responseData"] ["feed"] ["entries"] ["0"], потому что теперь он возвращает мне то, что я пытаюсь прочитать из недопустимой позиции. –

+1

@ThadeuFernandes: Я думаю, что это прекрасно, поскольку 'entries', но' entries' - это массив. Я подозреваю, что вы просто хотите избавиться от '[" 0 "]' и, возможно, 'Children()' call. Будет редактировать. –

+0

@ThadeuFernandes: Я редактировал код, который работает для меня ... –

1

Ваша проблема не имеет ничего общего с JSON, но с попыткой создать экземпляр интерфейса, который не является возможно в C#. Вам нужно создать экземпляр конкретного класса, который реализует интерфейс IList. Список будет одним из примеров. Есть и другие, включая массивы.