使用Kiota Graph SDK for .NET实现非IParsable对象的序列化与反序列化
解决方案
要处理包含IParsable对象的非IParsable类的序列化/反序列化,同时生成Graph原生格式JSON,可通过自定义System.Text.Json转换器结合Kiota序列化逻辑实现,具体步骤如下:
1. 实现IParsable类型的自定义Json转换器
该转换器将IParsable对象的序列化/反序列化逻辑委托给Kiota的原生序列化器,确保生成的JSON符合Graph格式,且不包含SDK依赖属性:
using System.Text.Json; using System.Text.Json.Serialization; using Microsoft.Kiota.Abstractions.Serialization; using Microsoft.Kiota.Serialization.Json; public class IParsableJsonConverter<T> : JsonConverter<T> where T : IParsable, new() { private readonly ISerializationWriterFactory _serializerFactory = new JsonSerializationWriterFactory(); private readonly IParseNodeFactory _parserFactory = new JsonParseNodeFactory(); // 反序列化:将JSON转为IParsable对象 public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var rawJson = JsonDocument.ParseValue(ref reader).RootElement.GetRawText(); using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(rawJson)); var parseNode = _parserFactory.CreateParseNode("application/json", stream); return parseNode.GetObjectValue<T>(); } // 序列化:将IParsable对象转为Graph原生JSON public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options) { using var stream = new MemoryStream(); var serializer = _serializerFactory.CreateSerializationWriter("application/json"); serializer.WriteObjectValue(null, value); serializer.Flush(); stream.Position = 0; using var streamReader = new StreamReader(stream); var rawJson = streamReader.ReadToEnd(); writer.WriteRawValue(rawJson); } }
2. 配置转换器处理目标类
有两种方式将自定义转换器应用到ReadData类的IParsable属性上:
方式一:在属性上直接标注转换器
public class ReadData { [JsonConverter(typeof(IParsableJsonConverter<Group>))] public Group GroupData { get; set; } [JsonConverter(typeof(IParsableJsonConverter<Team>))] public Team TeamData { get; set; } }
方式二:全局注册转换器(适合多类型场景)
var jsonOptions = new JsonSerializerOptions { // 忽略null值,符合Graph API常见格式 DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; // 注册需要处理的IParsable类型转换器 jsonOptions.Converters.Add(new IParsableJsonConverter<Group>()); jsonOptions.Converters.Add(new IParsableJsonConverter<Team>());
3. 序列化与反序列化示例
序列化(生成Graph原生JSON)
var readData = new ReadData { GroupData = new Group { DisplayName = "研发部小组", Description = "负责后端系统开发" }, TeamData = new Team { DisplayName = "前端协作组", Description = "负责前端界面实现" } }; var graphJson = JsonSerializer.Serialize(readData, jsonOptions); // 输出的JSON无backingstore、odatatype等SDK内部属性,完全符合Graph原生格式
反序列化(从Graph JSON转为对象)
var graphJson = @"{ ""GroupData"": { ""displayName"": ""研发部小组"", ""description"": ""负责后端系统开发"" }, ""TeamData"": { ""displayName"": ""前端协作组"", ""description"": ""负责前端界面实现"" } }"; var readData = JsonSerializer.Deserialize<ReadData>(graphJson, jsonOptions); // 成功将JSON反序列化为包含IParsable对象的ReadData实例
核心原理
Kiota的序列化器是Graph SDK 5的底层依赖,本身就是用来生成/解析Graph原生JSON的,不会额外添加backingstore、odatatype等SDK内部属性。通过自定义转换器,让System.Text.Json处理外层非IParsable类的结构,同时将IParsable属性的序列化/反序列化逻辑委托给Kiota,完美兼顾两种类型的处理需求。
内容的提问来源于stack exchange,提问作者user15854784
相关产品推荐
相关产品推荐

