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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:23:11