簡體   English   中英

(反)序列化 Json 與 System.Text.Json 和 Newtonsoft.Json

[英](De)serializing Json with System.Text.Json and Newtonsoft.Json

我正在處理與 IotHub SDK 一起使用的遺留系統。該應用程序同時使用 System.Text.Json(已同意將其用於當前和未來的開發)和 Newtonsoft.Json(反)序列化 JSON。

我需要將以下 JSON 反序列化為 Dictionary<string,object> 因為該值可以是字符串或 JSON object:

{
  "route1": "route 1 text",
  "route2": {
    "route": "route 2 text",
    "priority": 1,
    "timeToLiveSecs": 60
  }
}

我期望的是該值將被反序列化為:

  • route1 作為字符串
  • 路線 2 為 object

但是 System.Text.Json 將這兩個值反序列化為 JsonElement。 要獲取值,需要調用像 GetString() 這樣的方法(見最后一行) 在此處輸入圖像描述

由於 Newtonsoft 和 System.Text.Json 在此遺留應用程序中的使用組合,因此使用 Newtonsoft 序列化此 object 不起作用。

在此處輸入圖像描述

反序列化和重新序列化僅在兩個過程中使用相同的庫時才有效。 微軟自己的 IoTHub SDK 使用 Newtonsoft.Json。

在這種情況下,有沒有辦法讓兩個庫協同工作? 當第 3 方庫有可能使用另一個庫時,我發現使用其中任何一個來反序列化 object 類型都是危險的。

從官方文檔中獲取:“System.Text.Json 默認情況下是嚴格的,避免代表調用者進行任何猜測或解釋,強調確定性行為。庫是為了性能和安全性而有意設計的。Newtonsoft.Json 是靈活的默認。這種設計上的根本差異是以下默認行為中許多特定差異的背后原因。” 來源: https://learn.microsoft.com/en-us/do.net/standard/serialization/system-text-json/migrate-from-newtonsoft?pivots=do.net-7-0

如您所見,Newtonsoft 和 Microsoft 之間的核心原則不同。 文檔中還指出:“JsonElement 是您可以搜索和枚舉的內容,您可以使用 JsonElement 將 JSON 元素具體化為 .NET 類型。”

如您的屏幕截圖所示,System.Text.Json 檢測到正確的類型(字符串)-> 請參閱 ValueKind 屬性。 您可以訪問該屬性並進行處理。 除此之外,沒有辦法可以互換使用這兩個庫,因為它們有不同的方法。

withJsonDeserializer["route1"].ValueKind

暫無
暫無

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

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