避免在域模型中使用JsonIgnore属性

时间:2014-03-25 15:14:53

标签: c# .net json.net

我有一个包含多个实体类的域模型组件。在另一个组件中,我使用Json.NET序列化实现了实体存储库。我想在序列化期间忽略一些实体属性,因此直接的解决方案是使用JsonIgnore属性来装饰这些属性。但是,在原则上,我想避免在我的域模型中引用其他组件 - 包括第三方库,如Json.NET。

我知道我可以按照here所述创建自定义合约解析程序,但很难概括在各种实体中序列化和不序列化的内容。通常我想忽略所有只读属性,但是例如集合有例外:

public List<Pixel> Pixels
{
    get { return this.Pixels; }
}

我还可以为here描述的每个实体创建一个专用的合约解析器,但对我来说这似乎是一个高维护的解决方案 - 特别是对于众多实体。

理想的解决方案是,如果Json.NET支持.NET框架中的某些属性,但我甚至找不到合适的候选者......

我考虑在我的域模型中创建自己的自定义Ignore属性,并制作一个自定义合约解析器,它使用反射来检测此属性,并在序列化时忽略修饰的属性。但这真的是解决特定问题的最佳解决方案吗?

3 个答案:

答案 0 :(得分:10)

I believe by default that Json.net Respects DataContractAttribute。虽然你必须是包容性的而不是排他性的,但这也意味着序列化可以改为微软二进制(或者xml),而不必重新设计你的域模型。

  

如果一个类有很多属性而你只想序列化它们的一小部分,那么将JsonIgnore添加到所有其他属性将是乏味且容易出错的。解决此方案的方法是将DataContractAttribute添加到类,将DataMemberAttributes添加到要序列化的属性。这是选择性序列化,与使用JsonIgnoreAttribute的选择退出序列化相比,只有您标记的属性被序列化。

[DataContract]
public class Computer
{
  // included in JSON
  [DataMember]
  public string Name { get; set; }
  [DataMember]
  public decimal SalePrice { get; set; }

  // ignored
  public string Manufacture { get; set; }
  public int StockCount { get; set; }
  public decimal WholeSalePrice { get; set; }
  public DateTime NextShipmentDate { get; set; }
}

答案 1 :(得分:1)

Json序列化程序还支持opt-in serialization

[JsonObject(MemberSerialization.OptIn)]
public class File
{
  // excluded from serialization
  // does not have JsonPropertyAttribute
  public Guid Id { get; set; }

  [JsonProperty]
  public string Name { get; set; }

  [JsonProperty]
  public int Size { get; set; }
}

答案 2 :(得分:0)

您可以考虑使用视图模型之类的东西来控制实体模型的哪些属性被序列化。我自己还没有使用它,但是考虑将它用于我的项目,但AutoMapper可能需要考虑将实体模型与序列化模型分离。