Разбор данных из JSON в форму Windows - PullRequest
0 голосов
/ 12 апреля 2019

Я получаю JSON из веб-службы и получаю эту ошибку:

Ошибка CS0030 Невозможно преобразовать тип 'PokeForm.MoveInformation' в 'PokeForm.Move'

Это код, который я использую для запроса веб-службы и классов, которые я использую для анализа данных в нужном мне формате:

private void GrabData()
{
    WebClient syncClient = new WebClient();
    string url = "https://pokeapi.co/api/v2/pokemon/lucario/";
    string response = syncClient.DownloadString(url);

    var bl = JsonConvert.DeserializeObject<PokeAPI[]>(response);
    foreach (PokeAPI ro in bl)
    {
        if (ro.Moves != null)
        {
            foreach (MoveInformation mi in ro.Moves)
            {
                Move mv = mi.Move;
                MessageBox.Show(mv.Name);
            }
        }
    }
}

public class PokeAPI
{
    public List<MoveInformation> Moves { get; set; }
}
public class MoveInformation
{
    public Move Move { get; set; }
}
public class Move
{
    public string Name { get; set; }
    public string Url { get; set; }
}

Что нужно изменить в моем цикле foreach, чтобы данные отображались по моему желанию?

EDIT
Я отредактировал мой синтаксис в соответствии с ответом

foreach (MoveInformation mi in ro.Moves)
{
  Move mv = mi.Move;
  MessageBox.Show(mv.Name);
}

А теперь я получаю эту ошибку во время выполнения:

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

Это JSON - https://pokeapi.co/api/v2/pokemon/lucario/

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

PokeAPI.Moves - это List<MoveInformation>, а не List<Move>.Таким образом, ваш внутренний foreach должен быть:

foreach (MoveInformation mi in ro.Moves)
{
    Move mv = mi.Move;
    ...
}

РЕДАКТИРОВАТЬ:

Ошибка времени выполнения означает, что вы пытаетесь десериализовать в массив, но JSON представляет один объект.

Измените свой код на это:

var ro = JsonConvert.DeserializeObject<PokeAPI>(response);
if (ro.Moves != null)
{
    foreach (MoveInformation mi in ro.Moves)
    {
        Move mv = mi.Move;
        MessageBox.Show(mv.Name);
    }
}
0 голосов
/ 12 апреля 2019

если PokeAPI - это список, он должен выглядеть следующим образом:

var ro = JsonConvert.DeserializeObject<PokeAPI>(response);

, тогда ro - это список класса PokeAPi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...