Newtonsoft忽略属性



我目前正在使用相同的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)

相关内容

  • 没有找到相关文章

最新更新