Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Json在运行时忽略属性_C#_Json_Rest_Security_Asp.net Core Webapi - Fatal编程技术网

C# Json在运行时忽略属性

C# Json在运行时忽略属性,c#,json,rest,security,asp.net-core-webapi,C#,Json,Rest,Security,Asp.net Core Webapi,我有一个Web服务,它根据从客户端收到的请求返回对象。假设基于用户权限,我想对客户端隐藏一些属性值。 我有一个解决方案:我可以克隆需要发送的对象,但不包括克隆和发送过程中需要的属性。到目前为止,这是我找到的最好的解决方案,但我想知道是否有其他方法可以指定Json序列化程序的属性列表,以便它自动为我执行此操作 如果这是出于用户权限考虑,那么您不应该依赖于数据序列化的方式(这里是JSON)。更改序列化过程或发送JSON以外的其他内容的那天会发生什么?您最终将发送不适当的数据 在我看来,更好的选择是首

我有一个Web服务,它根据从客户端收到的请求返回对象。假设基于用户权限,我想对客户端隐藏一些属性值。
我有一个解决方案:我可以克隆需要发送的对象,但不包括克隆和发送过程中需要的属性。到目前为止,这是我找到的最好的解决方案,但我想知道是否有其他方法可以指定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响应以包含特定属性?