字典和 Flurl
Dictionaries and Flurl
我希望在 PokeAPI 中为 bulbasaur (https://pokeapi.co/) 访问“front_default”精灵。
我有以下集合初始值设定项:
public class PokemonModel
{
public int Id { get; set; }
public string Name { get; set; }
public Dictionary<string, string> Sprites { get; set; }
}
以及我的 WPF MainWindow 的以下代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async Task LoadImage(int pokedexNumber = 1)
{
PokedexProcess pkdx = new PokedexProcess();
PokemonModel pkmn = await pkdx.LoadPokedex(pokedexNumber);
var uriSource = new Uri(Convert.ToString(pkmn.sprites["front_default"]), UriKind.Absolute);
pokemonImage.Source = new BitmapImage(uriSource);
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
await LoadImage();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
}
}
public class PokedexProcess
{
public async Task<PokemonModel> LoadPokedex(int number)
{
var url = new Url($"https://pokeapi.co/api/v2/pokemon/{ number }");
PokemonModel pkmn = await url.GetJsonAsync<PokemonModel>();
return pkmn;
}
}
但是,当我尝试使用它访问精灵时,我收到以下错误消息:
Flurl.Http.FlurlParsingException: 'Response could not be deserialized to JSON: GET https://pokeapi.co/api/v2/pokemon/1'
内部异常
JsonReaderException: Unexpected character encountered while parsing value: {. Path 'sprites.other', line 1, position 162133.
我能想到的唯一错误就是试图以错误的方式访问它。
要访问特定的精灵,我需要访问 https://pokeapi.co/api/v2/pokemon/1,然后是图像的精灵->front_default->url
您收到错误消息,因为您的模型期望 sprites
中的所有值都是具有 Dictionary
值的键。但是,根据有效负载,sprites
字段还包含对象。
序列化程序无法将 sprites.other
对象反序列化为 Dictionary
类型。
如果您只需要从 sprite
获取 front_default
值,那么请尝试在您的模型中只定义您需要的值。像这样。
public class PokemonModel
{
public int Id { get; set; }
public string Name { get; set; }
public SpritesModel Sprites { get; set; }
}
public class SpritesModel
{
public string Front_Default { get; set; }
}
如果您想为您的 SpritesModel
使用更多 C# 风格的 属性 名称,例如 FrontDefault
,您可以使用序列化属性来实现。您可以找到更多详细信息 here
我希望在 PokeAPI 中为 bulbasaur (https://pokeapi.co/) 访问“front_default”精灵。
我有以下集合初始值设定项:
public class PokemonModel
{
public int Id { get; set; }
public string Name { get; set; }
public Dictionary<string, string> Sprites { get; set; }
}
以及我的 WPF MainWindow 的以下代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async Task LoadImage(int pokedexNumber = 1)
{
PokedexProcess pkdx = new PokedexProcess();
PokemonModel pkmn = await pkdx.LoadPokedex(pokedexNumber);
var uriSource = new Uri(Convert.ToString(pkmn.sprites["front_default"]), UriKind.Absolute);
pokemonImage.Source = new BitmapImage(uriSource);
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
await LoadImage();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
}
}
public class PokedexProcess
{
public async Task<PokemonModel> LoadPokedex(int number)
{
var url = new Url($"https://pokeapi.co/api/v2/pokemon/{ number }");
PokemonModel pkmn = await url.GetJsonAsync<PokemonModel>();
return pkmn;
}
}
但是,当我尝试使用它访问精灵时,我收到以下错误消息:
Flurl.Http.FlurlParsingException: 'Response could not be deserialized to JSON: GET https://pokeapi.co/api/v2/pokemon/1'
内部异常
JsonReaderException: Unexpected character encountered while parsing value: {. Path 'sprites.other', line 1, position 162133.
我能想到的唯一错误就是试图以错误的方式访问它。
要访问特定的精灵,我需要访问 https://pokeapi.co/api/v2/pokemon/1,然后是图像的精灵->front_default->url
您收到错误消息,因为您的模型期望 sprites
中的所有值都是具有 Dictionary
值的键。但是,根据有效负载,sprites
字段还包含对象。
序列化程序无法将 sprites.other
对象反序列化为 Dictionary
类型。
如果您只需要从 sprite
获取 front_default
值,那么请尝试在您的模型中只定义您需要的值。像这样。
public class PokemonModel
{
public int Id { get; set; }
public string Name { get; set; }
public SpritesModel Sprites { get; set; }
}
public class SpritesModel
{
public string Front_Default { get; set; }
}
如果您想为您的 SpritesModel
使用更多 C# 风格的 属性 名称,例如 FrontDefault
,您可以使用序列化属性来实现。您可以找到更多详细信息 here