我目前正在使用相同的C#DTO通过LoveSeat从CouchDB中提取数据,我将通过ASP MVC控制器返回JSON。
在通过控制器发送DTO之前,我正在使用NewtonSoft库对它们进行序列化。
然而,由于CouchDB也使用NewtonSoft,它也尊重属性级别的NewtonSoft属性,如
[JsonIgnore]
[JsonProperty("foo")]
是否有任何方法可以告诉newtonsoft库显式忽略这些属性?LoveSeat允许我提供自己的IObjectSerializer实现,这使我能够完全控制netwonsofts JsonSerializerSettings。那么,我可以通过使用这些设置来忽略这些属性吗?
我问,在这一点上,我能看到的唯一选择就是欺骗我的DTO。虽然这并不可怕,但也不太好。
我唯一能看到的另一种方法是在我的项目中引入我自己版本的Newtonsoft.Json源代码,使用不同的程序集名称等。但这种方式肯定是疯狂的,我会在走这条路之前欺骗DTO。
我不确定这是否是您想要的,但据我所知,您正在寻找[JsonIgnore]
属性。停止将属性与对象的其余部分序列化为JSON。
[JsonIgnore]
public string Whatever{ get; set; }
一个你可能不喜欢的建议。对于最佳实践,我建议使用两个几乎相同的对象。一个专门用于映射到数据库的数据访问层(域对象)。以及您的应用程序关心的单独DTO。这样,域对象将主要包含比DTO更多的属性,并且您可以将关注点分开。
根据Json.NET文档
您可以将方法添加到类中:public bool ShouldSerialize_________(){...}
,并在空白处填充不想序列化的属性的名称。如果该方法返回false
,则该属性将被忽略。
如果员工的经理是同一名员工,文档中的示例不希望序列化该员工的经理。
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);
}
}
你可以在你的课上设置一些禁止设置:
public class DTO
{
[JsonIgnore]
public bool IsWritingToDatabase { get; set; }
public string AlwaysSerialize { get; set; }
public string Optional { get; set; }
public bool ShouldSerializeOptional()
{
return IsWritingToDatabase;
}
}
但是,这并不比拥有两个对象简单多少。因此,我建议按照@zbugs的说法,对API侧和DB侧进行单独的定义。
我最终制作了所有需要的属性,只向虚拟添加属性,并在另一个类中用相关的newtonsoft属性单独覆盖它们。
这允许我在从CouchDB进行去串行化和为GET进行串行化时有不同的串行化行为,而不会有太多的欺骗。两者结合在一起是很好的,也是一种奖励;不管怎样,我都希望基地有任何变化。
如果能知道我最初的问题是否可行,那还是很好的?
这个newtonking.com链接在类似的情况下也有所帮助。它扩展了DefaultContractResolver
类。为了让它发挥作用,我不得不更换
protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract)
带有
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)