我目前正在使用相同的C#DTO通过LoveSeat从CouchDB中提取数据,我将通过ASP MVC控制器返回JSON。
我正在使用NewtonSoft库来扫描我的DTO,然后通过控制器发送它们。
然而,由于CouchDB也使用NewtonSoft,它也尊重属性级别的NewtonSoft属性,例如
[JsonIgnore]
[JsonProperty("foo")]
有没有告诉newtonsoft库明确忽略这些属性? LoveSeat允许我提供我自己的IObjectSerializer实现,这使我可以完全控制netwonsofts JsonSerializerSettings。那么,我可以通过使用这些设置来忽略这些属性吗?
我认为,在这一点上,我能看到的唯一选择是欺骗我的DTO。虽然不是那么可怕,但也不是很好。
我能看到的唯一另一种方法是将我自己的Newtonsoft.Json源版本引入我的项目,使用不同的程序集名称等等。但这种方式疯狂绝对是谎言,我将在我之前欺骗DTO走这条路。
答案 0 :(得分:77)
我不确定这是否是你所追求的,但据我所知,你正在寻找[JsonIgnore]
属性。阻止将属性与对象的其余部分序列化为JSON。
[JsonIgnore]
public string Whatever{ get; set; }
答案 1 :(得分:9)
您可能不喜欢的一个建议。对于最佳实践,我建议使用两个几乎相同的对象。一个专门用于映射到数据库的数据访问层(域对象)。以及您的应用所关注的单独DTO。这样,域对象将主要包含比DTO更多的属性,您可以将关注点分开。
答案 2 :(得分:5)
我最终创建了我需要的所有属性,只需将属性添加到虚拟,并使用相关的newtonsoft属性在另一个类中单独覆盖它们。
这允许我在从CouchDB反序列化和串行化GET时具有不同的序列化行为,而没有太多的欺骗。两者相结合是好的,也是奖励;无论如何我想要的任何基础变化。
知道我的原始问题是否可行仍然很好吗?
答案 3 :(得分:5)
使用条件属性将属性排除在序列化之外。
public class Employee
{
public string Name { get; set; }
public Employee Manager { get; set; }
public bool ShouldSerializeManager()
{
// don't serialize the Manager property if an employee is their own manager
return (Manager != this);
}
}
https://www.newtonsoft.com/json/help/html/SerializeConditionalProperty.htm
答案 4 :(得分:3)
This newtonking.com link帮助了类似的情况。它扩展了DefaultContractResolver
类。为了使它工作,我不得不替换
protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract)
与
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)