字典和 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