c# - 将数据从 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 对象反序列化。
解决方案
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);
}
}
推荐阅读
- laravel - 为 foreach() -laravel 8 提供的参数无效
- android - 如何纠正附加的颤振文档中的这个错误?
- html - 带有香草 HTML 的表单中的单选输入中的多个值
- r - 通过 purrr/map 从模型拟合请求预测时公式不匹配
- java - 在 Java 中使用 Linux 路径时 POST 请求失败
- rabbitmq - 使用来自 bitnami 的 helm3 安装 Rabbitmq 会抛出 chart.metadata 是必需的
- javascript - 如何查找和过滤属于用户的博客?
- python - 如何调试 AttributeError:“列表”对象没有属性“匹配”
- reactjs - 将数据从孩子传递给父母会影响性能吗?(反应)
- angular - Mat芯片列表选择单个ExpressionChangedAfterItHasBeenCheckedError