【问题标题】:JSON/XML serialization: Ignore/include some fields from the base classJSON/XML 序列化:忽略/包含基类中的一些字段
【发布时间】:2013-09-08 12:49:39
【问题描述】:

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

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

如果没有 - 控制 序列化输出中的类字段?定义指定的 JSON/XML 序列化器?使用Controller 中的选定字段将类对象转换为另一个类对象?

【问题讨论】:

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


    【解决方案1】:

    您应该使用特定于您当前操作的 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 的用法。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    相关资源
    最近更新 更多