数组 JSON 反序列化

Array JSON deserialize

我正在尝试从网站 RSS 获取数据并将其转换为 JSON。我得到了这个 JSON 字符串:

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

我正在使用列表来获取值,但出现此错误 "Cannot create an instance of the abstract class or interface",我不知道如何解决。它发生在这一行。

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/#/

您的问题与 json 无关,而是与尝试创建接口实例有关,这在 C# 中是不可能的。您需要创建一个实现 IList 接口的具体实例 class。列表就是一个例子。还有其他的,包括数组。

您遇到的错误与 JSON 无关。这是因为您正在尝试创建接口的实例。你 可以 通过给它具体的 List<T> class:

来解决这个问题
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();