Невозможно десериализовать текущий массив JSON

Во-первых: я новичок в использовании JSON и использовал ответы на здесь, чтобы использовать Json.Net для десериализации данных из API Pokemon в класс C# (класс Pokemon). Я использовал http://json2csharp.com, чтобы помочь мне определить свой класс, и это выглядит так:

public class Pokemon
{
    public Pokemon(string json)
    {         
        JsonConvert.PopulateObject(json, this, PokeApi.JsonSerializerSettings);
    }
    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("evolutions")]
    public Evolutions evolutions { get; set; }

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

с кучей других свойств, таких как resource_uri, статистика атаки и т. д.

Как сказано в ответе, предложенном по вышеупомянутой ссылке, я использовал JsonConvert.DeserializeObject(json) следующим образом:

public Pokemon GetPokemon(int nationalId)
{
using (WebClient client = new WebClient())
        {
            var json = client.DownloadString("http://pokeapi.co/api/v1/pokemon/" + nationalId + "/");
            var output = JsonConvert.DeserializeObject<Pokemon>(json);

            return output;
        }
    }

Однако я продолжаю получать исключение, в котором говорится: «Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип« Эволюции », потому что для этого типа требуется объект JSON ...»

Я нашел много других вопросов, задающих одно и то же, но меня смутили самые популярные ответы - иногда ответ заключался в использовании JsonProperty, иногда в использовании JsonConverter без объяснения того, что все это значит. Мне нужны оба?

Изменить: образец json (вызов: http://pokeapi.co/api/v1/pokemon/ 1/)

{
  "abilities": [
    {
      "name": "overgrow",
      "resource_uri": "/api/v1/ability/1/"
    },
    {
      "name": "chlorophyll",
      "resource_uri": "/api/v1/ability/2/"
    }
  ],
  "attack": 49,
  "catch_rate": 45,
  "created": "2013-11-02T12:08:25.745455",
  "defense": 49,
  "egg_cycles": 21,
  "egg_groups": [
    {
      "name": "Monster",
      "resource_uri": "/api/v1/egg/1/"
    },
    {
      "name": "Grass",
      "resource_uri": "/api/v1/egg/8/"
    }
  ],
  "ev_yield": "1 Sp Atk",
  "evolutions": {
    "level": 16,
    "method": "level up",
    "resource_uri": "/api/v1/pokemon/2/",
    "to": "Ivysaur"
  },
  "exp": 64,
  "growth_rate": "ms",
  "happiness": 70,
  "height": "2'4",
  "hp": 45,
  "male_female_ratio": "87.5/12.5",
  "modified": "2013-11-02T13:28:04.914889",
  "moves": [
    {
      "learn_type": "other",
      "name": "Tackle",
      "resource_uri": "/api/v1/move/1/"
    },
    {
      "learn_type": "other",
      "name": "Growl",
      "resource_uri": "/api/v1/move/2/"
    },
    {
      "learn_type": "level up",
      "level": 10,
      "name": "Vine whip",
      "resource_uri": "/api/v1/move/3/"
    }
  ],
  "name": "Bulbasaur",
  "national_id": 1,
  "resource_uri": "/api/v1/pokemon/4/",
  "sp_atk": 65,
  "sp_def": 65,
  "species": "seed pokemon",
  "speed": 45,
  "total": 318,
  "types": [
    {
      "name": "grass",
      "resource_uri": "/api/v1/type/5/"
    },
    {
      "name": "poison",
      "resource_uri": "/api/v1/type/8/"
    }
  ],
  "weight": "15.2lbs"
}

Класс эволюции:

public class Evolutions
{
    public int level { get; set; }
    public string method { get; set; }
    public string resource_uri { get; set; }
    public string to { get; set; }
}

person user3294629    schedule 18.02.2014    source источник
comment
можете ли вы предоставить образец json? также схему класса Evolutions   -  person Cris    schedule 18.02.2014


Ответы (1)


Я попробовал http://json2csharp.com/ с http://pokeapi.co/api/v1/pokemon/19/ и то, что я вижу,

public class RootObject
{
    //...
    public List<Evolution> evolutions { get; set; }
   //...
}

Эта симпатичная каша — ваш класс покемонов. Поэтому вам нужно объявить Evolutions как список.

person Andrey Stukalin    schedule 18.02.2014
comment
Хах, на самом деле мне дали публичные эволюции Evolutions { get; задавать; }. Я объявил эволюции как список, и теперь я получаю System.Reflection.TargetInvocationException: Исключение было вызвано целью вызова. ---› System.ArgumentNullException. - person user3294629; 18.02.2014
comment
добавить эволюции = новый список‹Эволюция›() в конструкторе - person Andrey Stukalin; 18.02.2014
comment
@user3294629 user3294629 удалите ваш конструктор - person L.B; 18.02.2014
comment
@LB О ... Это сработало, и теперь я чувствую себя глупо. Если не слишком глупый вопрос - как наличие конструктора привело к этому исключению? _ - person user3294629; 18.02.2014
comment
@ user3294629 это единственный конструктор вашего объекта, и Json.net использует его для создания экземпляра, но в этом случае параметр json имеет значение null. Итак, вы передаете null в JsonConvert.PopulateObject - person L.B; 18.02.2014