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

时间:2013-09-04 20:52:29

标签: c# xml json serialization asp.net-web-api

Web API JSON和XML媒体类型格式化程序(尤其是序列化程序)could be configured中使用[JsonIgnore][DataMember]装饰器。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

如果您不想编写映射代码以从DTO映射到业务对象,则可以使用AutoMapper

示例代码:

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();
  }
}

以下示例未演示AutoMapper的用法,但它确实演示了DTO的用法。