【问题标题】:Dictionaries and Flurl字典和 Flurl
【发布时间】:2020-11-25 04:17:27
【问题描述】:

我希望访问球茎龙 (https://pokeapi.co/) 的 PokeAPI 中的“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: '响应无法反序列化为 JSON: GET https://pokeapi.co/api/v2/pokemon/1'

内部异常

JsonReaderException:解析值时遇到意外字符:{。路径“sprites.other”,第 1 行,位置 162133。

我能想到的唯一错误是试图以错误的方式访问它。

要访问特定的精灵,我需要访问https://pokeapi.co/api/v2/pokemon/1,然后访问 sprites->front_default->图像的 url

【问题讨论】:

    标签: c# api dictionary flurl


    【解决方案1】:

    您会收到错误消息,因为您的模型预计 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

    【讨论】:

    • 非常感谢您的回答,这解决了我的问题。我已经尝试过类似的方法,但在第二类中使用了另一个字典而不是字符串。
    猜你喜欢
    • 2019-05-20
    • 2021-05-17
    • 1970-01-01
    • 2020-12-15
    • 2013-04-29
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多