Newtonsoft忽略属性?

时间:2011-06-10 17:04:03

标签: c# asp.net-mvc couchdb json.net

我目前正在使用相同的C#DTO通过LoveSeat从CouchDB中提取数据,我将通过ASP MVC控制器返回JSON。

我正在使用NewtonSoft库来扫描我的DTO,然后通过控制器发送它们。

然而,由于CouchDB也使用NewtonSoft,它也尊重属性级别的NewtonSoft属性,例如

[JsonIgnore]
[JsonProperty("foo")]

有没有告诉newtonsoft库明确忽略这些属性? LoveSeat允许我提供我自己的IObjectSerializer实现,这使我可以完全控制netwonsofts JsonSerializerSettings。那么,我可以通过使用这些设置来忽略这些属性吗?

我认为,在这一点上,我能看到的唯一选择是欺骗我的DTO。虽然不是那么可怕,但也不是很好。

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

5 个答案:

答案 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)