httpClient.GetFromJsonAsync .NET Core 3.1 returns 带转换器的空项目

httpClient.GetFromJsonAsync .NET Core 3.1 returns empty items with a converter

我正在处理托管的 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 为 null,则反序列化是正确的。

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

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);

成功了

今天早上我又试了一次,成功了.... 所以解决方案是众所周知的 'shut up and reboot' 方法