【发布时间】:2023-12-26 04:18:01
【问题描述】:
通过 SharePoint 和 MS Graph 提供的“帮助”组合,将 JSON 数据转换为类型化数据模型的工作似乎变得更加复杂。 :-)
我在 Microsoft 365 中有一个 SharePoint 列表,我通过 C# 中的图形 API 访问它,其中查询目标是一个类型化的类,其属性与 SharePoint 列表列属性相同。
ListItem 类 Graph API 在 Fields.AdditionalData 类型的 Dictionary<string,object{System.Text.Json.JsonElement}> 中返回结果,它需要变成 IEnumerable<DataItem>,我可以通过 Serialize/Deserialize 从查询结果中获取 List往返,如下:
var backToJSON = ListItems.Select(o => System.Text.Json.JsonSerializer.Serialize(o.Fields.AdditionalData));
var stronglyTypedItems = backToJSON.Select(jsonO => System.Text.Json.JsonSerializer.Deserialize<DataItem>(jsonO));
有没有办法做到这一点,无论是使用更智能的 OData 还是我没见过的 Graph API 中的东西,而不需要使用过去的 JSON 并通过 JSON 序列化器将其发送回两次?强>
更多详情如下:
来自 Graph Explorer 的示例输出 JSON,其中 value 包含一个数组:
"value" : [
{ "id": "1001,
"fields": {
"Column" : "true",
"Column2" : "value2",
"Column3" : "65"
}
},
{ "id": "1002,
"fields": {
<and so forth until the array terminates>
]
}
对应的 C# 类(字面意思是使用“将 JSON 粘贴为类”构建的):
Public class DataItem {
public bool Column {get; set;}
public string Column2 {get; set;}
public int Column3 {get; set;}
}
C# Graph API 中的“Helper”类提供大部分转换为我实际需要的字段数组:
private static GraphServiceClient graphClient;
public static IListItemsCollectionRequest LicenseExpirationsList => graphClient
.Sites["<guid>"]
.Lists["<nameOfList>"].Items
.Request()
.Header("Accept", "application/json;odata.metadata=none")
.Select("fields,id")
.Expand("fields");
var ListItems = (await GraphHelper.LicenseExpirationsList.GetAsync()).CurrentPage;
// JSON round tripping through JSONSerializer to get the strong type...
// But why? ListItems.Fields.AdditionalData is a Dictionary of JSON elements in the first place!
var backToJSON = ListItems.Select(o => System.Text.Json.JsonSerializer.Serialize(o.Fields.AdditionalData));
var stronglyTypedItems = backToJSON.Select(jsonO => System.Text.Json.JsonSerializer.Deserialize<DataItem>(jsonO));
return stronglyTypedItems;
【问题讨论】:
标签: c# json microsoft-graph-api sharepoint-online sharepoint-list