牛顿软件忽略属性?

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

我正在使用 NewtonSoft 库来系列化我的 DTO,然后再通过控制器发送它们。

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

[JsonIgnore]
[JsonProperty("foo")]

是否可以告诉 newtonsoft 库明确忽略这些属性?LoveSeat 允许我提供自己的 IObjectSerializer 实现,它使我能够完全控制网络软件 JsonSerializerSettings。那么,我可以通过使用这些设置来忽略这些属性吗?

我问,作为唯一的选择,我可以看到在这一点上,是欺骗我的 DTO。虽然不是很糟糕,但也不是很好。

我能想到的唯一其他办法就是引入我自己的牛顿软件。使用不同的程序集名称等等。但这种疯狂肯定是骗人的,我只会在走这条路之前欺骗 DTO。

113549 次浏览

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

最后,我创建了所有只需要向虚拟中添加属性的属性,并在另一个类中使用相关的 newtonsoft 属性单独重写它们。

这允许我在从 CouchDB 反序列化和为 GET 序列化时有不同的序列化行为,而不会受到太多的欺骗。这是好的,并且一个奖励,这两个是耦合的; 任何基础上的变化,我无论如何都会想要的。

我还是很想知道我最初的问题是否可行?

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

protected override IList<JsonProperty> CreateProperties(JsonObjectContract contract)

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

我不确定这是否是您想要的,但是根据我的理解,您正在寻找 [JsonIgnore]属性。停止将属性与对象的其余部分序列化为 JSON。

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

根据 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;
}
}

但是,这并不比拥有两个对象简单多少。因此,我建议按@zbug 所说的那样做,并为 API 端和 DB 端分别定义。