根据用户确定要在Json.Net中序列化的属性
我正在创建一个ASP MVC Web API。 我现在想要根据正在执行请求的用户确定要对象序列化的属性。 ApiController知道用户。 基于用户,我有一个函数返回一个字符串数组,其中包含用户对模型有权限的属性名称。
如何将用户传递给ContractResolver,以便它只影响当前请求而不会影响其他用户的同步请求?
您可以创建自定义ContractResolver
var json = JsonConvert.SerializeObject( new UserClass() {ID=666, Name="john", SurName="doe"}, new JsonSerializerSettings() { ContractResolver = new CustomContractResolver(new[]{"ID", "SurName"}) } );
在这个例子中,输出json将只包含ID
和SurName
(不是Name
)
public class UserClass { public int ID { set; get; } public string Name {set; get;} public string SurName { set; get; } } public class CustomContractResolver : Newtonsoft.Json.Serialization.DefaultContractResolver { IEnumerable _allowedProps = null; public CustomContractResolver(IEnumerable allowedProps) { _allowedProps = allowedProps; } protected override IList CreateProperties(Type type, MemberSerialization memberSerialization) { return _allowedProps.Select(p=>new JsonProperty() { PropertyName = p, PropertyType = type.GetProperty(p).PropertyType, Readable = true, Writable = true, ValueProvider = base.CreateMemberValueProvider(type.GetMember(p).First()) } ).ToList(); } }
难道你不能为api收到的每个请求创建一个新的合约解析器吗?
只要您为每个请求创建一个新实例,合同解析器就永远不会相互冲突。
代码可能如下所示:
var resolver = new MyUserBasedResolver(userObject); JsonConvert.SerializeObject( product, Formatting.Indented, new JsonSerializerSettings { ContractResolver = resolver } );
- UseWindowsAzureActiveDirectoryBearerAuthentication如何在validation令牌时起作用?
- JSON.Net自定义合同序列化和集合
- 如何防止单个对象属性在字符串时转换为DateTime
- Web Api 2会话
- validationASP.NET Web API
- C# – OData:无法使用带有’new’属性的Type构建System.Web.Http.OData.Delta
- 当代码的所有部分都不是异步时,异步Web服务有什么好处
- 尝试使用.netstandard 2程序集时,Web Api 2运行时错误
- 动态忽略控制器上的WebAPI方法以获取api资源管理器文档