【问题标题】:Cannot serialize stream data asp .net core无法序列化流数据asp .net核心
【发布时间】:2020-05-01 18:52:20
【问题描述】:

试图从 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

【问题讨论】:

  • 我在这里有点不确定,但我认为调用ReadAsStringAsync() 从流中读取是不可能的。这是读取同一数据流的两种方式,默认情况下,流并不适用于此。
  • 如果您将var reponseString = await response.Content.ReadAsStringAsync(); 向下移动一行,您可能会看到data 不再为空,而reponseString 现在为空
  • 不,还是一样的结果
  • 是的,我明白我的假设不正确。当您说“所有对象属性都是空值”时,您能否举例说明 reponseString 包含的内容以及您的 Tournament 类的外观。听起来属性映射出了问题。
  • codeshare.io/GkLV0M - 不知道你是否想通过所有这些。最后 18 个实体我必须手动输入,所以那里可能会有一些错误。因此,如果有任何不匹配,则不会分配任何属性?那么反序列化器不应该抛出异常吗?

标签: c# json asp.net-core


【解决方案1】:

问题在于,您在 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 字符串具有 null 作为值,但该属性不可为空 - 我没有检查您的所有属性。 DeserializeAsync 会抛出错误并告诉你。

【讨论】:

  • 非常感谢,添加根类后完美运行
猜你喜欢
  • 1970-01-01
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-09-24
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多