JSON/XML 序列化:忽略/包含基类中的某些字段

本文关键字:字段 基类 包含 XML 序列化 忽略 JSON | 更新日期: 2023-09-27 18:30:23

Web API中,可以使用[JsonIgnore][DataMember]装饰器配置JSON和XML媒体类型格式化程序(尤其是序列化程序)。

它仅适用于方法字段,但是基类呢?有没有办法忽略或包含它的某些字段?

如果没有 - 控制可见性的最佳方法是什么序列化输出中的类字段?定义指定的 JSON/XML 序列化程序?将类对象转换为Controller中具有选定字段的另一个类对象?

JSON/XML 序列化:忽略/包含基类中的某些字段

应使用特定于当前操作的 DTO,然后将数据从 DTO 复制到要使用的实际对象。

这样做的好处是,您可以定义特定于此操作的验证,并且业务对象上没有属性。您可以为每个新 DTO 的每个操作使用不同的验证规则,并且仍使用相同的业务对象。

如果不想编写映射代码以从 DTO 映射到业务对象,则可以使用自动映射程序。

示例代码:

public enum ColourType
{
  Flat,
  Metallic
}
public class Car
{
  public void Repaint(int red, int green, int blue, ColourType colourType)
  {
    // TODO: Add some validation logic and business logic.
  }
}
public class RepainInMetallicModel
{
  [Required]
  [Range(0, 100)]
  public int Red { get; set; }
  [Required]
  [Range(0, 100)]
  public int Green { get; set; }
  [Required]
  [Range(0, 100)]
  public int Blue { get; set; }
}
public class RepaintInFlatModel
{
  [Required]
  [Range(0, 255)]
  public int Red { get; set; }
  [Required]
  [Range(0, 255)]
  public int Green { get; set; }
  [Required]
  [Range(0, 255)]
  public int Blue { get; set; }
}
public class CarController
{
  public ActionResult RepaintInMetallic(RepainInMetallicModel model)
  {
    if (ModelState.IsValid)
    {
      var car = _carsRepository.Find(model.Id);
      var.Repaint(model.Red, model.Green, model.Blue, ColourType.Metallic);
      _carsRepository.Save(car);
    }
    return View();
  }
  public ActionResult RepaintInFlat(RepaintInFlatModel model)
  {
    if (ModelState.IsValid)
    {
      var car = _carsRepository.Find(model.Id);
      var.Repaint(model.Red, model.Green, model.Blue, ColourType.Flat);
      _carsRepository.Save(car);
    }
    return View();
  }
}

下面的示例不演示自动映射程序的用法,但演示了 DTO 的用法。