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' 方法
我正在处理托管的 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' 方法