【发布时间】: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