You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 23:45:01