如何建模目标类以在 .NET 5 中接收 JSON HTML 响应

问题描述 投票:0回答:1

我正在尝试从公共 Web API 读取对象列表,该 API 提供带有对象数组的 JSON 文件,我正在使用 Blazor 和 .NET 5 平台。

反序列化失败并出现以下错误:

System.Text.Json.JsonException:JSON 值无法转换为 Meme[]。

我怀疑我错误地建模了“接收”对象,我是否应该更改代码或使用其他库才能使此代码成功?

可以在此端点找到API。我尝试用这两种方式阅读回复:

var response = await Http.GetFromJsonAsync<Meme[]>("https://api.imgflip.com/get_memes");

var httpResponse = await Http.GetAsync("https://api.imgflip.com/get_memes");
var response = await httpResponse.Content.ReadFromJsonAsync<Meme[]>();

Meme 类声明如下:

public string Id { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public int Width { get; set; }
public int Height { get; set; }
public int BoxCount { get; set; }

并且回复应包含以下内容:

"success": true,
"data": {
    "memes": [
        {
            "id": "181913649",
            "name": "Drake Hotline Bling",
            "url": "https://i.imgflip.com/30b1gx.jpg",
            "width": 1200,
            "height": 1200,
            "box_count": 2
        },
        {
            ...
        },
        ... 
    ]
}

这些是我包含的库:

using System.Net.Http;
using System.Net.Http.Json;
c# json asp.net-core blazor-webassembly json-deserialization
1个回答
2
投票

回复不仅仅包含您的模因本身。 Meme 数组位于对象

data
memes
内。对整个响应进行建模,您将能够反序列化它。因此,您将需要以下内容:

    public class Response
    {
        public bool success { get; set; }
        public Data data { get; set; }
    }

    public class Data
    {
        public Meme[] memes { get; set; }
    }

    public class Meme
    {
        public string id { get; set; }
        public string name { get; set; }
        public string url { get; set; }
        public int width { get; set; }
        public int height { get; set; }
        public int box_count { get; set; }
    }

// Now you can use that like this:

var response = await httpResponse.Content.ReadFromJsonAsync<Response>();

请注意,VS 中有一个方便的工具可以为我生成它。您可以将 JSON 作为类粘贴到

Edit > Paste Special > Paste JSON as Classes
下。您仍然可以使用“普通”驼峰式大小写,但您可能必须指示序列化程序不匹配区分大小写的属性名称。

© www.soinside.com 2019 - 2024. All rights reserved.