![](/img/trans.png)
[英]Mixing System.Text.Json and Newtonsoft.Json with Swagger
[英](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
}
}
我期望的是該值將被反序列化為:
但是 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.