C# Json在运行时忽略属性
我有一个Web服务,它根据从客户端收到的请求返回对象。假设基于用户权限,我想对客户端隐藏一些属性值。C# Json在运行时忽略属性,c#,json,rest,security,asp.net-core-webapi,C#,Json,Rest,Security,Asp.net Core Webapi,我有一个Web服务,它根据从客户端收到的请求返回对象。假设基于用户权限,我想对客户端隐藏一些属性值。 我有一个解决方案:我可以克隆需要发送的对象,但不包括克隆和发送过程中需要的属性。到目前为止,这是我找到的最好的解决方案,但我想知道是否有其他方法可以指定Json序列化程序的属性列表,以便它自动为我执行此操作 如果这是出于用户权限考虑,那么您不应该依赖于数据序列化的方式(这里是JSON)。更改序列化过程或发送JSON以外的其他内容的那天会发生什么?您最终将发送不适当的数据 在我看来,更好的选择是首
我有一个解决方案:我可以克隆需要发送的对象,但不包括克隆和发送过程中需要的属性。到目前为止,这是我找到的最好的解决方案,但我想知道是否有其他方法可以指定Json序列化程序的属性列表,以便它自动为我执行此操作 如果这是出于用户权限考虑,那么您不应该依赖于数据序列化的方式(这里是JSON)。更改序列化过程或发送JSON以外的其他内容的那天会发生什么?您最终将发送不适当的数据 在我看来,更好的选择是首先根据您的用户权限创建一个CLR对象(例如,只将所需的属性复制到另一个类中),然后担心将其序列化为JSON,而不考虑用户权限
因此,基本上,将数据过滤从JSON转移到CLR。Yo可以在不希望序列化的属性上使用[JsonIgnore]
public class Engine
{
[Key]
public string Id { get; set; }
[JsonIgnore]
public int engineNo { get; set; }
[JsonIgnore]
public string engineHost { get; set; }
}
当您返回json结果时,它将自动忽略这些属性:
public JsonResult GetEngineers()
{
var engines= _context.Engines.ToList() ;
return Json(engines);
}
结果:
[{"id":"1"},{"id":"2"}]
指
此外,IContractResolver接口提供了一种自定义JsonSerializer如何将.NET对象序列化和反序列化为JSON的方法,而无需在类上放置属性
请参阅您可以使用ShouldSerialize方法动态忽略属性,假设您有一个名为FirstName的属性,然后您可以创建下面给出的方法
public bool ShouldSerializeFirstName()
{
return false; // this could be a conditional statement
}
到目前为止,这是我的解决方案,但我想知道是否有其他方法可以在不影响新实例的情况下实现它。实际上,这是一种基于用户权限的ViewModel。您可以使用JsonConvert填充对象。填充(文本,对象)存在的属性将被设置,不存在的属性将被忽略。当web api响应包含所有数据时,您想在客户端中创建它吗?或者您想更改web api响应以包含特定属性?