首页 > 解决方案 > 无法序列化流数据asp .net core

问题描述

试图从 HTTP 响应中反序列化对象。响应流以 json 格式返回信息,我已经检查过它在在线反序列化器中是否有效。我从 API 框架中获得了对象类,所以我认为应该为响应配置所有属性。代码:

            var request = new HttpRequestMessage(HttpMethod.Get,
                "api_url");
            var client = _clientFactory.CreateClient();

            var response = await client.SendAsync(request);

            if (response.IsSuccessStatusCode)
            {
                using var responseStream = await response.Content.ReadAsStreamAsync();
                var reponseString = await response.Content.ReadAsStringAsync();
                var data = await JsonSerializer.DeserializeAsync<IEnumerable<Tournament>>(responseStream);
            }
            else
            {
                GetBranchesError = true;
            }

我看到 responseString 中的信息是正确的,但数据对象始终为空。奇怪的部分是它部分工作,因为它显示了 responseStream 中有多少对象,但所有对象属性都是空值。还尝试将流位置设置为 0 - 没有帮助。知道我在反序列化这些对象方面做错了什么吗?使用的解串器 - System.Text.Json;项目asp .net core 3.1

标签: c#jsonasp.net-core

解决方案


问题是您在 JSON 数组中查找的属性实际上包含在一个名为“比赛”的对象中。当您像这样很好地格式化 JSON 字符串时,会更容易注意到:

[
    {
        "tournament": {
            "id": 1,
            "name": "name1",
            ...
        }
    },
    {
        "tournament": {
            "id": 2,
            "name": "name2",
            ...
        }
    }
]

要反序列化,我建议您制作一个包装类来处理它:

 public class TournamentItem
 {
    [JsonPropertyName("tournament")]
    public Tournament Tournament { get; set; }
 }

然后反序列化到那个类:

var data = await JsonSerializer.DeserializeAsync<IEnumerable<TournamentItem>>(responseStream);

现在data.Tournament将包含所有属性。

Spam例如,您的属性中可能仍然存在一些问题。JSON 字符串具有nullas 值,但该属性不可为空 - 我没有检查您的所有属性。DeserializeAsync会抛出一个错误并告诉你。


推荐阅读