首页 > 解决方案 > 将数据从 JSON 解析到 Windows 窗体

问题描述

我正在从 Web 服务中检索 JSON 并收到此错误:

错误 CS0030 无法将类型“PokeForm.MoveInformation”转换为“PokeForm.Move”

这是我用来查询 Web 服务的代码以及我用来将数据解析为所需格式的类:

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以便数据按我的意愿显示?

编辑
我根据答案将我的语法编辑为以下

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/

标签: c#jsonwinformsjson.net

解决方案


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);
    }
}

推荐阅读