首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JSON反序列化

用JSON反序列化
EN

Stack Overflow用户
提问于 2021-07-17 10:57:15
回答 3查看 125关注 0票数 1

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

'System.Collections.Generic.List`1MovieReommendation.Movie‘:“无法将当前JSON对象(例如,{”名称“:”值“})反序列化为类型Newtonsoft.Json.JsonSerializationException,因为该类型需要一个JSON数组(例如,1、2、3)才能正确反序列化。要修复此错误,要么将JSON更改为JSON数组(例如,1,2,3),要么更改反序列化类型,使之成为可以从JSON对象反序列化的普通.NET类型(例如,不像整数这样的原始类型,而不是数组或列表之类的集合类型)。还可以将JsonObjectAttribute添加到类型中,以强制它从JSON对象反序列化。路径‘搜索’,第1行,位置10。“

这是我的密码:

代码语言:javascript
复制
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; }
}
代码语言:javascript
复制
{
    "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"
    }, {....
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-07-17 11:12:31

您需要一个Root类。

代码语言:javascript
复制
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对象。

代码语言:javascript
复制
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;
    }
}

FYI,您可以使用json2csharp生成基于JSON结果的类。

票数 1
EN

Stack Overflow用户

发布于 2021-07-17 11:18:05

尝试定义类,如下所示

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

现在,当DeserializeObject,键入它到MoviesRoot,你应该是好的去

代码语言:javascript
复制
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内部转换json或使用第三方工具。

票数 0
EN

Stack Overflow用户

发布于 2021-07-17 12:19:46

你的json不是数组。它是一个具有键的对象,它是一个数组。这两类人之间有区别。您的json代表的是第一个,而不是第二个。第二个问题是您试图将其序列化为什么。

代码语言:javascript
复制
public class Search {
List<Movie> search ; 
}
代码语言:javascript
复制
List<Movie> movies;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68419851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档