Json Deserialize Array - PullRequest
       19

Json Deserialize Array

0 голосов
/ 04 октября 2019

Я новичок в Json и пытаюсь сделать несколько примеров с ним. У меня есть данные Json, такие как:

{
  "Title": "The Avengers",
  "Year": "2012",
  "Rated": "PG-13",
  "Released": "04 May 2012",
  "Runtime": "143 min",
  "Genre": "Action, Adventure, Sci-Fi",
  "Director": "Joss Whedon",
  "Writer": "Joss Whedon (screenplay), Zak Penn (story), Joss Whedon (story)",
  "Actors": "Robert Downey Jr., Chris Evans, Mark Ruffalo, Chris Hemsworth",
  "Plot": "Earth's mightiest heroes must come together and learn to fight as a team if they are going to stop the mischievous Loki and his alien army from enslaving humanity.",
  "Language": "English, Russian, Hindi",
  "Country": "USA",
  "Awards": "Nominated for 1 Oscar. Another 38 wins & 79 nominations.",
  "Poster": "https://m.media-amazon.com/images/M/MV5BNDYxNjQyMjAtNTdiOS00NGYwLWFmNTAtNThmYjU5ZGI2YTI1XkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_SX300.jpg",
  "Ratings": [
    {
      "Source": "Internet Movie Database",
      "Value": "8.0/10"
    },
    {
      "Source": "Rotten Tomatoes",
      "Value": "92%"
    },
    {
      "Source": "Metacritic",
      "Value": "69/100"
    }
  ],
  "Metascore": "69",
  "imdbRating": "8.0",
  "imdbVotes": "1,200,683",
  "imdbID": "tt0848228",
  "Type": "movie",
  "DVD": "25 Sep 2012",
  "BoxOffice": "$623,279,547",
  "Production": "Walt Disney Pictures",
  "Website": "http://marvel.com/avengers_movie",
  "Response": "True"
}

Я могу получить данные и прочитать их очень хорошо, но когда происходит десериализация, я получаю следующую ошибку:

Newtonsoft.Json. JsonSerializationException: 'Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип' System.Collections.Generic.List`1 [Deneme.Modeller.Main] ', поскольку для типа требуется массив JSON (например,[1,2,3]) для правильной десериализации. Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы это был нормальный тип .NET (например, не примитивный тип, например, целое число, а не тип коллекции, например,массив или список), которые можно десериализовать из объекта JSON. JsonObjectAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из объекта JSON.

Это мой код

string url = "http://www.omdbapi.com/?apikey=7663ce8e&t=Avengers";
WebRequest request = WebRequest.Create(url);
WebResponse reply;
reply = request.GetResponse();
StreamReader returninfo = new StreamReader(reply.GetResponseStream());
string getinfo = returninfo.ReadToEnd();
List<Main> Info = JsonConvert.DeserializeObject<List<Main>>(getinfo);

, а для моделей это первый основной:

public string Title { get; set; }
public string Year { get; set; }
public string Rated { get; set; }
public string Released { get; set; }
public string Runtime { get; set; }
public string Genre { get; set; }
public string Director { get; set; }
public string Writer { get; set; }
public string Actors { get; set; }
public string Plot { get; set; }
public string Language { get; set; }
public string Country { get; set; }
public string Awards { get; set; }
public string Poster { get; set; }
public List<Rating> Ratings { get; set; }
public string Metascore { get; set; }
public string imdbRating { get; set; }
public string imdbVotes { get; set; }
public string imdbID { get; set; }
public string Type { get; set; }
public string DVD { get; set; }
public string BoxOffice { get; set; }
public string Production { get; set; }
public string Website { get; set; }
public string Response { get; set; }

второй - для Рейтингов:

public string Source { get; set; }
public string Value { get; set; }
public virtual ICollection<Main> Mains { get; set; }

Речь идет о массиве Json, но я посмотрел заданные вопросы об этой проблеме и попытался ее исправить, но безуспешно. Чего мне не хватает?

Ответы [ 4 ]

1 голос
/ 04 октября 2019

Вы пытаетесь десериализовать отдельный объект типа Main в список объектов.

Вы можете изменить код для десериализации в один объект вместо списка, или вы можете изменить свой JSON для представления массива объектов.

Первый вариант будет

Main Info = JsonConvert.DeserializeObject<Main>(getinfo);

И второй вариант

[{"Title":"The Avengers","Year":"2012","Rated":"PG-13","Released":"04 May 2012","Runtime":"143 min","Genre":"Action, Adventure, Sci-Fi","Director":"Joss Whedon","Writer":"Joss Whedon (screenplay), Zak Penn (story), Joss Whedon (story)","Actors":"Robert Downey Jr., Chris Evans, Mark Ruffalo, Chris Hemsworth","Plot":"Earth's mightiest heroes must come together and learn to fight as a team if they are going to stop the mischievous Loki and his alien army from enslaving humanity.","Language":"English, Russian, Hindi","Country":"USA","Awards":"Nominated for 1 Oscar. Another 38 wins & 79 nominations.","Poster":"https://m.media-amazon.com/images/M/MV5BNDYxNjQyMjAtNTdiOS00NGYwLWFmNTAtNThmYjU5ZGI2YTI1XkEyXkFqcGdeQXVyMTMxODk2OTU@._V1_SX300.jpg","Ratings":[{"Source":"Internet Movie Database","Value":"8.0/10"},{"Source":"Rotten Tomatoes","Value":"92%"},{"Source":"Metacritic","Value":"69/100"}],"Metascore":"69","imdbRating":"8.0","imdbVotes":"1,200,683","imdbID":"tt0848228","Type":"movie","DVD":"25 Sep 2012","BoxOffice":"$623,279,547","Production":"Walt Disney Pictures","Website":"http://marvel.com/avengers_movie","Response":"True"}]

(просто добавьте скобки)

Какой вариант вы должны выбрать, зависит от ваших требований, то есть, если вы хотите разрешить несколько объектов илитолько один.

0 голосов
/ 04 октября 2019

когда мы вызываем API 'http://www.omdbapi.com/?apikey=7663ce8e&t=Avenger', мы получаем объект, а не массив объектов

try

 var info = JsonConvert.DeserializeObject<Main>(getinfo);

Если вы хотите список фильмов, попробуйте другой API: themoviedbAPI

0 голосов
/ 04 октября 2019

Вы пытаетесь десериализовать один объект JSON в список объектов.

Это пример простого объекта:

{ "field": 123 }

Чтобы десериализовать его, вам необходимо:

var obj = JsonConvert.DeserializeObject<SomeModel>(json);

Но если у вас есть массив объектов:

[{ "field": 123 }, { "field": 123 }]

Вы сможете десериализовать их в такой список:

var objs = JsonConvert.DeserializeObject<SomeModel[]>(json);

или

var objs = JsonConvert.DeserializeObject<List<SomeModel>>(json);

Решения вашего вопроса:

  • Измените тип десериализации на один объект.
  • Оберните ваш JSON с помощью []
0 голосов
/ 04 октября 2019
Main Info = JsonConvert.DeserializeObject<Main>(getinfo);

В вашей строке json есть только один главный объект, вы пытались получить список

...