实体每个[JsonIgnore]

时间:2019-01-26 20:15:17

标签: c# .net-core entity-framework-core

我大概有60-70个类,它们都具有各种Id列,当我从Web API返回JSON数据时,我想排除这些列。在内部,我加入Id,但是任何前端都使用Guid。因此,我的主键是Id(int),然后有一个Guid供外界使用,以使事情更加安全。

通常,您只需要在属性上添加[JsonIgnore]即可,但是我有很多类可能会不时更新。每当我脚手架一切并强制覆盖时,它都会删除我的更改。

与其将[JsonIgnore]手动添加到我要排除的每个Id列中,在OnModelCreating中处理它似乎更合乎逻辑。我能够遍历属性并使用.Ignore,但这也会从其他所有内容中删除该属性。我只是不希望它序列化并返回任何名为“ Id”的列和任何外键(也为Ids)。

这是一个班级的例子

[JsonIgnore]
public int Id { get; set; }
public Guid Guid { get; set; }
public string Name { get; set; }
public bool? Active { get; set; }

[JsonIgnore]
public int HoldTypeId { get; set; }
public DateTime CreateDateTime { get; set; }
public DateTime UpdateDateTime { get; set; }

我可以通过艰苦的方式“使其发挥作用”,但是我希望有一种快速简便的方法来获得相同的结果,以便我可以在重要的部分上花费时间。

编辑: 这是将数据返回给用户的内容。

// GET: api/Distributors
[HttpGet]
public async Task<ActionResult<IEnumerable<Distributor>>> GetDistributor()
{
    return await _context.Distributor.ToListAsync();
}

1 个答案:

答案 0 :(得分:2)

您可以编写自己的DefaultContractResolver来排除序列化过程中所需的任何属性。

下面有一个示例:

{"_id": "weld-424", "fullName": "Jane Doe", "updated": {"$date":"2018-11-01T04:00:00.000Z"}, "created": {"$date":"2018-11-01T04:00:00.000Z"}}
{"_id": "mown-175", "fullName": "John Doe", "updated": {"$date":"2018-11-01T04:00:00.000Z"}, "created": {"$date":"2018-11-01T04:00:00.000Z"}}

那么您应该像下面这样在public class PropertyIgnoringContractResolver : DefaultContractResolver { private readonly Dictionary<Type, string[]> _ignoredPropertiesContainer = new Dictionary<Type, string[]> { // for type student, we would like to ignore Id and SchooldId properties. { typeof(Student), new string[] { "Id", "SchoolId" } } }; protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); string[] ignoredPropertiesOfType; if (this._ignoredPropertiesContainer.TryGetValue(member.DeclaringType, out ignoredPropertiesOfType)) { if (ignoredPropertiesOfType.Contains(member.Name)) { property.ShouldSerialize = instance => false; // Also you could add ShouldDeserialize here as well if you want. return property; } } return property; } } 的{​​{1}}中进行配置

Startup.cs

但是,我实际上要做的是创建响应DTO以匹配我的API响应的需求。而不是返回原始实体类型。喜欢;

ConfigureServices

通过实施类似的操作,您还可以通过仅选择API响应所需的属性来优化数据库查询。