如何将Microsoft Graph ListItem输出转换为对应C#类型且避免双重序列化
解决方案
方案1:直接从现有JsonElement反序列化,省去序列化步骤
原来的序列化再反序列化的往返操作完全多余:Fields.AdditionalData中存储的object实际类型就是System.Text.Json.JsonElement,本身就是从原始响应JSON解析得到的结构化数据,不需要再序列化为字符串。
替换你的转换代码为以下实现即可减少一次JSON序列化开销:
var stronglyTypedItems = ListItems.Select(o => System.Text.Json.JsonSerializer.Deserialize<DataItem>((System.Text.Json.JsonElement)o.Fields.AdditionalData) );
方案2:直接解析原始响应,跳过SDK默认模型转换(性能最优)
如果想要完全避免不必要的模型转换,可以直接读取Graph API的原始响应内容,自定义反序列化到你需要的结构,完全绕开SDK内置的ListItem、AdditionalData解析逻辑:
实现代码:
// 定义匹配Graph返回结构的包装类 public class GraphResponseWrapper { [System.Text.Json.Serialization.JsonPropertyName("value")] public List<GraphListItem> Value { get; set; } } public class GraphListItem { [System.Text.Json.Serialization.JsonPropertyName("id")] public string Id { get; set; } [System.Text.Json.Serialization.JsonPropertyName("fields")] public DataItem Fields { get; set; } } // 替换原来的GetAsync调用,直接取原始响应 var responseMessage = await GraphHelper.LicenseExpirationsList.GetResponseAsync(); responseMessage.EnsureSuccessStatusCode(); await using var responseStream = await responseMessage.Content.ReadAsStreamAsync(); var graphResult = await System.Text.Json.JsonSerializer.DeserializeAsync<GraphResponseWrapper>(responseStream); var stronglyTypedItems = graphResult.Value.Select(item => item.Fields);
注意事项
如果SharePoint列的实际返回名称和你定义的DataItem属性名不一致,只需要给对应属性加上JsonPropertyName特性匹配返回的字段名即可。
内容的提问来源于stack exchange,提问作者Rob Perkins
相关产品推荐
相关产品推荐

