Newtonsoft忽略属性?

Jam*_*min 61 c# asp.net-mvc couchdb json.net

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

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

但是,由于CouchDB也使用NewtonSoft,因此它也尊重属性级别的NewtonSoft属性

[JsonIgnore]
[JsonProperty("foo")]
Run Code Online (Sandbox Code Playgroud)

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

我问,作为唯一的选择,我现在可以看到的是欺骗我的DTO.虽然并不可怕,但并不是很好.

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

Jim*_*mbo 85

我不确定这是不是你所追求的,但从我的理解你正在寻找[JsonIgnore]属性.阻止将属性与对象的其余部分序列化为JSON.

[JsonIgnore]
public string Whatever{ get; set; }
Run Code Online (Sandbox Code Playgroud)

  • 任何忽略反序列化但仍然序列化的解决方案?谢谢. (8认同)

小智 12

一个你可能不喜欢的建议.对于最佳实践,我建议使用两个几乎相同的对象.一个专门用于映射到数据库的数据访问层(域对象).以及您的应用所关注的单独DTO.这样,域对象将主要包含比DTO更多的属性,您可以分离关注点.


Jam*_*min 8

我最终创建了我需要的所有属性,只需将属性添加到虚拟,并使用相关的newtonsoft属性在另一个类中单独覆盖它们.

这允许我在从CouchDB反序列化和串行化GET时具有不同的序列化行为,而没有太多的欺骗.两者相结合是好的,也是奖励; 无论如何我想要的基数的任何变化.

知道我的原始问题是否可行仍然是一件好事?


alh*_*hpe 7

根据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);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在类上设置某种禁止设置:

public class DTO
{
    [JsonIgnore]
    public bool IsWritingToDatabase { get; set; }
    public string AlwaysSerialize { get; set; }
    public string Optional { get; set; }

    public bool ShouldSerializeOptional()
    {
        return IsWritingToDatabase;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这并不比拥有两个对象简单得多。因此,我建议按照@zbugs所述进行操作,并为API端和DB端分别定义。


joy*_*ym8 6

这个 newtonking.com 链接帮助了类似的情况。它扩展了DefaultContractResolver类。为了使它工作,我不得不更换

protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract)
Run Code Online (Sandbox Code Playgroud)

protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
Run Code Online (Sandbox Code Playgroud)