【问题标题】:httpClient.GetFromJsonAsync .NET Core 3.1 returns empty items with a converterhttpClient.GetFromJsonAsync .NET Core 3.1 使用转换器返回空项目
【发布时间】:2020-06-23 12:39:20
【问题描述】:

我正在开发托管的 blazor 应用程序 webassembly 核心,当我尝试从服务器获取项目集合时,我得到了正确数量的项目,但它们都是空的。

我的模型如下所示:

public interface IPerson
{
    string Name { get; set; }
}

public class Customer : IPerson
{
    public decimal CreditLimit { get; set; }
}

public class Employee : IPerson
{
    public string OfficeNumber { get; set; }
}

public class Model
{
    public string Name { get; set; }
    public float SomeParameters { get; set; }
    
    public IPerson Person { get; set; }
}

我使用 TypeDiscriminator 模板实现了一个转换器:https://docs.microsoft.com/fr-fr/dotnet/standard/serialization/system-text-json-converters-how-to#support-polymorphic-deserialization

使用客户端:

var options = new JsonSerializerOptions();
options.Converters.Add(new PersonConverterWithTypeDiscriminator());
return await httpClient.GetFromJsonAsync<IEnumerable<Model>>(baseAPIUri, options);

使用服务器端:

services.AddControllersWithViews()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new NullableStructSerializerFactory());
        options.JsonSerializerOptions.Converters.Add(new PersonConverterWithTypeDiscriminator());
        options.JsonSerializerOptions.IgnoreNullValues = true;
        options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
        options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase;
        options.JsonSerializerOptions.IgnoreReadOnlyProperties = true;
    });

当客户端将模型发送到服务器以保存它时,一切都很好,httpClient.PostAsJsonAsync(baseAPIUri, item, options);

但是当客户端要求收集时,我输入的是 write() 方法,而不是转换器的 read() 方法。

我尝试在没有序列化程序选项的情况下检索项目,如果参数 Person 为空,则反序列化是正确的。

编辑:我将 Http 响应内容复制到一个文件中,在控制台中创建了一个新项目 .Net 核心并添加以下行:

var options = new JsonSerializerOptions
    {
        IgnoreNullValues = true,
        PropertyNameCaseInsensitive = true,
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
        IgnoreReadOnlyProperties = true
    };
    options.Converters.Add(new NullableStructSerializerFactory());
    options.Converters.Add(new PersonConverterWithTypeDiscriminator());
    
string json = File.ReadAllText("D:\\model.json");
var newModel = System.Text.Json.JsonSerializer.Deserialize<IEnumerable<Model>>(json, options);

成功了

【问题讨论】:

  • 您是否尝试像重置默认序列化程序一样重置所有序列化程序的选项。这不是覆盖而是替换。
  • 是的,我设置了完全相同的选项,但它并没有改变任何东西
  • 我在我的应用程序中使用了很多其他模型,但我只有这种类型的模型有这个问题,包含一个接口类型。出于同样的原因,我还有其他一些转换器,但是当我使用它们时,它只是传输接口模型或它们的集合。这是我第一次尝试转移包含接口参数的模型

标签: c# json asp.net-core httpclient blazor


【解决方案1】:

今天早上我又试了一次,它成功了...... 所以解决方案是众所周知的“关闭并重新启动”方法

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 2020-08-17
    • 2021-12-20
    • 2023-04-07
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多