强制 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("SELECT * FROM Person WHERE Id = 1");"从你的仓库返回什么数据。没有这个就不可能提出任何建议 【参考方案1】:

试试这个。它已经过测试并且可以正常工作

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 绑定到控制器

在 ASP.NET Core MVC6 中将文件和模型发布到控制器

ASP.NET Core —上传.json文件并转换为List