簡體   English   中英

C#MVC控件Newtonsoft.json序列化

[英]C# MVC Control Newtonsoft.json serialization

想象一下,我有一堂課

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跟着答案。 擴展了我自己的映射器,以將類映射到字典,並具有排除字段的功能。

您的問題是面向邏輯的。 您有不同的鍵值,您想根據情況將其發送給客戶。

Newtonsoft.Json對json進行序列化,這是它的目標,不建議在序列化器中添加邏輯,調試/維護更困難,讓一個對象/類做一件事情的想法就更難了。 這就是所謂的單一責任原則

如何/在何處添加邏輯? 我建議將命令模式與對象一起用作參數。 使用該“模式”,您可以輕松地添加參數(參數對象的屬性)並將邏輯添加到命令中。 最后,您可以返回鍵值列表或對象,並讓json.net對其進行序列化。

該解決方案似乎有些復雜,但從長遠來看絕對是有用的。 我可以詳細解釋如何實現它。

最后提示:您可以使用ASP.NET WEBAPI為您序列化對象(它使用來自Newtonsoft.Json的json.net)

我看到其他一些選擇:

  1. 將值留空。 您可以將JSON.NET配置為不將具有null或默認值的屬性寫入輸出流:

     JsonSerializerSettings settings = new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore, NullValueHandling = NullValueHandling.Ignore }; 
  2. JSON.NET也可以很好地處理Dictionary(字符串,對象)。 創建一個更具動態性的模型並正確映射它。 該詞典只是WebAPI的最終模型,您應該為其實現任何邏輯。 您還需要一些良好的映射邏輯,可以通過反射實現。

我會使用一個約定,在該約定中,您將為每個屬性自動創建一些映射邏輯,並為依賴於安全規則的屬性覆蓋此屬性,例如

  ModelMapper.CreateByConvention<Product>()
     .Map(x => x.Created)
          .Never()
     .Map(x => x.UserName)
          .WhenUserInRole(Roles.Administrator)
     .Map(x => x.FirstName)
          .WhenUser(u => u.CanSeeFirstName());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM