【发布时间】:2015-11-06 16:47:58
【问题描述】:
假设我有一堂课
public class Foo
{
public int Prop1 { get; set; }
public int Prop2 { get; set; }
public int Prop3 { get; set; }
}
想象一下,在某些控制器 FooController 中,我正在创建一个此类 Foo 类的 List,用数据填充它,使用 Newtonsoft.Json 对其进行序列化并发送到客户端。
没关系,没有问题。
但是,我也有每个用户的权限系统,它说 User1 看不到 Prop1 的数据,而 User2 看不到 Prop3 的数据。我有很多这样的类 Foo 和我系统的不同用户的很多权限。 而且,为了禁止用户查看不允许列中的数据,我决定中断 json 序列化并从 JSON 序列化中排除不允许的用户列。
目前它已经编写了自定义 JsonConverter,这让我可以这样做。但是,它很复杂(输入类扫描、动态访问器编译、递归等),并且与原生 newtonsoft 相比,速度较慢。
关于上述事实,我想问是否有更简单的方法来实现预期的结果?我的意思是,在不创建自定义 JsonConverter 的情况下,从任何使用 json 类序列化的列中删除任何列。
感谢您的回答!
更新 跟随@SebastianStehle 的回答。 扩展了我自己的映射器以将类映射到字典,并具有排除字段的能力。
【问题讨论】:
-
与其让我们“想象”,不如发布一些实际代码(并确保您格式化该代码!)。
-
为什么不根据用户权限剥离 FooController 中的 json Foo 条目呢?含义:序列化模型的所有必要信息,但根据权限对其进行转换。是否有要求用户可以看到原始 json 输出或其他内容?
-
不,我不允许发送未经允许的用户数据,因为我们的用户足够聪明,可以中断发布的数据
-
好的,所以这不是在后端,而是一些为前端提供数据的 json 服务。我看到你需要剥离物品。您是否为每种类型的权限考虑了单独的模型?例如,我们有一个对应于权限的子类模型,或者一个基于用户权限(在“gets{}”上)做出反应的模型。
-
现在我有大约 30 个不同的模型类。你建议我以任何可能的组合对每个类进行子类化?不,这不适合我的情况,因为我不知道哪些“列”对于下一个用户是不可见的。
标签: c# .net json asp.net-mvc-5 json.net