我大概有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();
}
答案 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响应所需的属性来优化数据库查询。