如何将Azure DevOps混合JSON与XML响应反序列化为C#类
解决Azure DevOps REST API混合JSON/XML反序列化问题
问题背景
从Azure DevOps REST API获取的响应为JSON结构,但部分字段值是XML格式字符串(如Microsoft.VSTS.TCM.Steps)。使用System.Text.Json直接反序列化到自定义C#类时,会抛出JsonException,无法将XML字符串直接转换为Steps类型对象。
解决方案:自定义JsonConverter
通过实现JsonConverter<Steps>,让System.Text.Json在反序列化时自动处理XML字符串到Steps对象的转换,无需事后手动处理。
1. 实现自定义转换器
创建StepsJsonConverter类,集成JsonConverter<Steps>,在读写方法中分别处理XML与对象的转换:
using System.Text.Json; using System.Text.Json.Serialization; using System.Xml.Serialization; using System.IO; public class StepsJsonConverter : JsonConverter<Steps> { private readonly XmlSerializer _xmlSerializer = new XmlSerializer(typeof(Steps)); public override Steps Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var xmlString = reader.GetString(); if (string.IsNullOrWhiteSpace(xmlString)) return null; using var stringReader = new StringReader(xmlString); return (Steps)_xmlSerializer.Deserialize(stringReader); } public override void Write(Utf8JsonWriter writer, Steps value, JsonSerializerOptions options) { using var stringWriter = new StringWriter(); _xmlSerializer.Serialize(stringWriter, value); writer.WriteStringValue(stringWriter.ToString()); } }
2. 标记属性使用转换器
在Fields类的MicrosoftVSTSTCMSteps属性上添加JsonConverter特性,指定使用自定义转换器:
public class Fields { // 其他属性... [JsonPropertyName("Microsoft.VSTS.TCM.Steps")] [JsonConverter(typeof(StepsJsonConverter))] public Steps MicrosoftVSTSTCMSteps { get; set; } }
3. 正常执行反序列化
原反序列化代码无需修改,转换器会自动处理XML字符串的转换:
var response = client.Get(request); if (response.StatusCode == HttpStatusCode.OK && response.Content != null) { return JsonSerializer.Deserialize<T>(response.Content); }
原理说明
自定义转换器在Read阶段读取JSON中的XML字符串,通过XmlSerializer反序列化为Steps对象;在Write阶段则将Steps对象序列化为XML字符串后写入JSON,完全适配混合格式的序列化/反序列化需求,无需额外的事后处理步骤。
内容的提问来源于stack exchange,提问作者Pebermynte Lars
相关产品推荐
相关产品推荐

