JSON/XML 序列化:忽略/包含基类中的某些字段
本文关键字:字段 基类 包含 XML 序列化 忽略 JSON | 更新日期: 2023-09-27 18:30:23
在Web API
中,可以使用[JsonIgnore]
或[DataMember]
装饰器配置JSON和XML媒体类型格式化程序(尤其是序列化程序)。
它仅适用于方法字段,但是基类呢?有没有办法忽略或包含它的某些字段?
如果没有 - 控制可见性的最佳方法是什么序列化输出中的类字段?定义指定的 JSON/XML 序列化程序?将类对象转换为Controller
中具有选定字段的另一个类对象?
应使用特定于当前操作的 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 的用法。