1

我从 OMDb API 下载了一个 JSON 字符串,现在我想反序列化为一个对象列表,但我得到了错误代码:

Newtonsoft.Json.JsonSerializationException:“无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1[MovieReommendation.Movie]',因为该类型需要 JSON 数组(例如 [1,2,3])正确反序列化。要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或将反序列化类型更改为正常的 .NET 类型(例如,不是像整数这样的原始类型,不是像数组或列表这样的集合类型)可以从 JSON 对象反序列化。也可以将 JsonObjectAttribute 添加到类型以强制它从 JSON 对象反序列化。路径“搜索” ,第 1 行,第 10 位。”

这是我的代码:

public void Import(string URL)
{
    using (WebClient wc = new WebClient())
    {
        var jsonString = wc.DownloadString(URL);
        var Json = JsonConvert.DeserializeObject<List<Movie>>(jsonString);
    }
}


public class Movie
{
    #region properties
    [JsonProperty("Title")]
    public string Title { get; set; }

    [JsonProperty("Year")]
    public string Year { get; set; }

    [JsonProperty("Type")]
    public string Type { get; set; }

    [JsonProperty("imbdID")]
    public int imbdID { get; set; }

    [JsonProperty("Poster")]
    public string Poster { get; set; }
}
{
    "Search": [{
        "Title": "Batman Begins",
        "Year": "2005",
        "imdbID": "tt0372784",
        "Type": "movie",
        "Poster": "https://m.media-amazon.com/images/M/MV5BOTY4YjI2N2MtYmFlMC00ZjcyLTg3YjEtMDQyM2ZjYzQ5YWFkXkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg"
    }, {
        "Title": "Batman v Superman: Dawn of Justice",
        "Year": "2016",
        "imdbID": "tt2975590",
        "Type": "movie",
        "Poster": "https://m.media-amazon.com/images/M/MV5BYThjYzcyYzItNTVjNy00NDk0LTgwMWQtYjMwNmNlNWJhMzMyXkEyXkFqcGdeQXVyMTQxNzMzNDI@._V1_SX300.jpg"
    }, {....
4

3 回答 3

1

你需要一Root堂课。

public class Root
{
    public List<Movie> Search { get; set; }
}

public class Movie
{
    [JsonProperty("Title")]
    public string Title { get; set; }

    [JsonProperty("Year")]
    public string Year { get; set; }

    [JsonProperty("Type")]
    public string Type { get; set; }

    [JsonProperty("imbdID")]
    public int imbdID { get; set; }

    [JsonProperty("Poster")]
    public string Poster { get; set; }
}

并且您需要将 JSON 反序列化为Root对象。

public void Import(string URL)
{
    using (WebClient wc = new WebClient())
    {
        var jsonString = wc.DownloadString(URL);
        var json = JsonConvert.DeserializeObject<Root>(jsonString);
        List<Movie> movies = json.Search;
    }
}

仅供参考,您可以使用json2csharp根据 JSON 结果生成类。

于 2021-07-17T11:12:31.113 回答
0

尝试如下定义一个类

  • 将json复制到windows剪贴板
  • 在您的项目中创建一个新类
  • 从 Visual Studio 编辑菜单中选择paste specialPaste Json as class进入刚刚创建的类
  • 删除原来的类
  • 在下面的示例中,MoviesRoot 是 RootObject

现在当 DeserializeObject 时,将它输入到 MoviesRoot ,你应该很高兴

public class MoviesRoot
{
    public Search[] Search { get; set; }
}

public class Search
{
    public string Title { get; set; }
    public string Year { get; set; }
    public string imdbID { get; set; }
    public string Type { get; set; }
    public string Poster { get; set; }
}

注意我注意到另一个回复作为发布,因此主要区别在于在 Visual Studio 内转换 json 或使用第三方工具。

于 2021-07-17T11:18:05.993 回答
0

您的 json 不是数组。它是一个对象,其键是一个数组。这两个类之间是有区别的。您的 json 代表第一个,而不是第二个。第二个是您尝试将其序列化的内容。

public class Search {
List<Movie> search ; 
}
List<Movie> movies;
于 2021-07-17T12:19:46.770 回答