2011-06-10 371 views
36

我目前使用相同的C#DTO通过LoveSeat将数据从CouchDB中提取出来,我将通过ASP MVC控制器返回JSON。Newtonsoft忽略属性?

我正在使用NewtonSoft库在通过控制器发送它们之前对我的DTO进行分区。

然而,随着CouchDB中也使用NewtonSoft它也尊重财产水平NewtonSoft属性,如

[JsonIgnore] 
[JsonProperty("foo")] 

反正是有告诉newtonsoft库明确忽略这些属性? LoveSeat允许我提供自己的IObjectSerializer impl,它使我可以完全控制netsonts的JsonSerializerSettings。那么,通过这些设置我可以忽略这些属性吗?

我问,作为目前唯一可以看到的替代方案是欺骗我的DTO。虽然不可怕,但并不好。

我能看到的唯一方法是将我自己的Newtonsoft.Json源代码版本引入到我的项目中,使用不同的程序集名称等。但这种方式的疯狂绝对存在,我只会在DTO之前我走在这条路上。

回答

4

我最终创建了所需的所有属性,只将属性添加到虚拟中,并在另一个类中将它们单独替换为相关的newtonsoft属性。

这允许我在从CouchDB进行反序列化并对GET进行序列化时不会有太多的欺骗,从而产生不同的序列化行为。这很好,也是一种奖励,两者相辅相成;无论如何,我想要改变基地。

这将仍然很高兴知道我的原始问题是否可能?

6

一个建议,你可能不喜欢。对于最佳做法,我建议有两个几乎相同的对象。一个专门用于映射到数据库的数据访问层(域对象)。还有一个独立的DTO,您的应用程序关心。通过这种方式,域对象将主要包含比DTO更多的属性,并且可以分离关注点。

+0

感谢您的回复!在这种情况下,数据源是CouchDB,而不是非SQL化数据库。因此它已经以JSON格式存储,并且可以直接从沙发上反序列化。所以唯一的区别就是牛顿软件的属性。正如我在origianl post中所说,如果没有其他办法,我准备下台DTO路线。 – Jammin 2011-06-10 19:14:58

2

This newtonking.com link有助于类似的情况。它扩展了DefaultContractResolver类。为了使工作我不得不更换

protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract) 

protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
38

我不知道这是否是你追求的,但是从我的理解,你要寻找的[JsonIgnore]属性。将属性从剩下的对象序列化为JSON。

[JsonIgnore] 
public string Whatever{ get; set; } 
+2

忽略反序列化但仍然序列化的任何解决方案? Thankyou。 – 2017-07-23 20:11:38