簡體   English   中英

如何將 Azure DocumentDB Document 類轉換為我的 POCO 類?

[英]How to cast Azure DocumentDB Document class to my POCO class?

有沒有辦法將Microsoft.Azure.Documents.Document對象轉換為我的類類型?

我用CosmosDBTrigger編寫了一個 Azure Function 類。 觸發器接收Microsoft.Azure.Documents.Document數組。 我喜歡有那個Document類,這樣我就可以訪問關於記錄本身的元數據,但我也想以靜態方式與我的類類型中的數據交互。

當我調用ToString時,我會看到我的數據的 JSON 表示。 我應該使用 Newtonsoft 將該 JSON 手動轉換為我的類類型嗎?

如果您需要在函數中將您的Document映射到您的 POCO,那么最簡單的方法就是您所建議的。

調用document.Resource.ToString()方法並使用來自 JSON.NET 或您喜歡的 json 庫的DeserializeObject 建議使用 JSON.NET,因為 Microsoft 的 CosmosDB 庫也使用它。

您的映射調用將如下所示:

var yourPoco = JsonConvert.DeserializeObject<YourPocoType>(document.Resource.ToString())

雖然 Nick Chapsas 提供的解決方案有效,但我想提供一些更好的選擇。

首選解決方案 - 改進您的模型

首先,如果您對額外的元字段感興趣,那么您始終可以將所選屬性包含到您的數據訪問模型中,並且它們將被填充。例如:

public class Model
{
    public String id { get; set; }
    public String _etag { get; set; }
    //etc.
}

然后,您可以使用現有的 API 進行反序列化,這對所有人來說都是明確且熟悉的。 例如:

var explicitResult = await client.ReadDocumentAsync<Model>(documentUri);
Model explicitModel = explicitResult.Document;

如果您希望下一層模型(例如:域模型)沒有那些特定於存儲的元字段,那么您需要轉換為另一個模型,但這不再是 cosmosDB 級別的問題,並且有很多通用映射器可以轉換POCO 之間。

如果您使用強類型文檔模型,這是在 cosmosDB 中處理數據訪問的最簡潔且推薦的方法。

替代方案:動態

另一個技巧是使用動態作為中間轉換步驟。 這在某種程度上是簡短而優雅的,但個人使用 dynamic 總是感覺有點臟:

var documentResult = await client.ReadDocumentAsync(documentUri);
Model dynamicModel = (dynamic)documentResult.Resource;

替代方法:讀取JObject

另一種選擇是將文檔作為 NewtonSoft 的JObject 這也將包括所有元字段,您可以自己進一步投射它,而無需在字符串表示之間進行所有額外的跳躍。 例子:

var jObjectResult = await client.ReadDocumentAsync<JObject>(documentUri);
Model JObjectResult = jObjectResult.Document.ToObject<Model>();

替代方案:同時使用Document + JObject

如果您真的想要避免模型中的文檔級元字段並仍然訪問它們,那么您可以使用一個小反射技巧從Document實例中獲取JObject

var documentResult = await client.ReadDocumentAsync(documentUri);
Document documentModel = documentResult.Resource;

var propertyBagMember = documentResult.Resource.GetType()
    .GetField("propertyBag", BindingFlags.NonPublic| BindingFlags.Instance);
Model reflectionModel = ((JObject)propertyBagMember.GetValue(documentResult.Resource))
    .ToObject<Model>();

請注意,反射技巧依賴於內部實現細節,並且不受庫作者向后兼容性保證的約束。

您可以簡單地在Microsoft.Azure.Documents.Document類中執行.ToString()

此類繼承自重寫.ToString()方法的Microsoft.Azure.Documents.JsonSerializable類。

下面是使用新的高性能System.Text.Json命名空間將Document類反序列化為我的Car.cs POCO 的System.Text.Json

Car car = JsonSerializer.Deserialize<Car>(document.ToString());

暫無
暫無

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

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