gpt4 book ai didi

c# - 实体 ForEach [JsonIgnore]

转载 作者:行者123 更新时间:2023-11-30 22:56:33 26 4
gpt4 key购买 nike

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

通常,您只需在属性上添加 [JsonIgnore],它就会处理它,但我有很多类可能会不时更新。每当我构建所有内容并强制覆盖时,它都会删除我的更改。

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

这是一个类的例子

[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();
}

最佳答案

你可以自己写DefaultContractResolver在序列化过程中排除您想要的任何属性。

下面有一个例子:

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

那么你应该在 ConfigureServicesStartup.cs 中配置它,如下所示

        public void ConfigureServices(IServiceCollection services)
{
services.AddMvc()
.AddJsonOptions(options => options.SerializerSettings.ContractResolver = new PropertyIgnoringContractResolver());
}

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

[HttpGet]
public async Task<ActionResult<IEnumerable<Distributor>>> GetDistributor()
{
return await _context.Distributor.Select(dist => new DistributorDTO
{
Name = dist.Name,
// so on..
}).ToListAsync();
}

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

关于c# - 实体 ForEach [JsonIgnore],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54382314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com