强制 ASP NET Core 控制器不序列化子类返回类型中的属性
Posted
技术标签:
【中文标题】强制 ASP NET Core 控制器不序列化子类返回类型中的属性【英文标题】:Force ASPNET Core Controller don't serialize properties on subclassed return type 【发布时间】:2021-12-14 15:38:39 【问题描述】:不确定标题的最佳表达方式。我想从控制器返回一个子类对象,但将其序列化,就好像它是基础对象一样,因为子类上有我不想传递给客户端的道具。
这样做的动机是我使用的是Dapper,扁平化的DbPerson可以直接来自数据库。
示例查询:
var person = conn.Query<DbPerson>("SELECT * FROM Person WHERE Id = 1");
示例...
鉴于我有这些课程:
class DbPerson : Person
public string City get; set;
public string State get; set;
public string Zip get; set;
public override Address Address => new Address
City = City,
State = State,
Zip = Zip,
;
class Person
public string Name get; set;
public virtual Address Address get; set;
class Address
public string City get; set;
public string State get; set;
public string Zip get; set;
还有这个控制器动作
public Person Get()
// This returns a Person object, but its really a DbPerson
return repo.Get();
我希望/期望结果是:
"Name": "Joe",
"Address":
"City": "New York",
"State": "NY",
"Zip": "123456"
但我得到了:
"Name": "Joe",
"Address":
"City": "New York",
"State": "NY",
"Zip": "123456"
,
"City": "New York",
"State": "NY",
"Zip": "123456"
我想我期待/希望控制器知道我正在尝试返回子类,并且当 System.Text.Json.JsonSerializer
内部序列化时,它会对控制器上的类型执行此操作。
我发现的唯一解决方法是在 DbPerson
内部制作道具。我想另一种方法是将 DbPerson “映射”到 Person (创建一个新实例)。这不太理想,因为每次添加字段时我都必须管理该映射。
我想知道是否有更一流的方法?
【问题讨论】:
您可以将JsonIgnore
属性添加到那些额外的属性中以防止序列化。
"var person = conn.Query试试这个。它已经过测试并且可以正常工作
class DbPerson : Person
private string _city;
private string _state;
private string _zip;
public string City set _city = value;
public string State set _state = value;
public string Zip set _zip = value;
public override Address Address => new Address
City = _city,
State = _state,
Zip = _zip,
;
测试
var json=
"Name": "Joe",
"City": "New York",
"State": "NY",
"Zip": "123456"
Person person = JsonConvert.DeserializeObject<DbPerson>(json);
输出
"Address":
"City": "New York",
"State": "NY",
"Zip": "123456"
,
"Name": "Joe"
【讨论】:
以上是关于强制 ASP NET Core 控制器不序列化子类返回类型中的属性的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET Core 中首次登录时强制重定向到另一个页面
对象反序列化在 Asp Net Core MVC 控制器中的 POST 失败
如何强制 Quartz 现在在 ASP.NET Core 中启动?
ASP.NET Core 模型未通过 AJAX 绑定到控制器