在.Net Core 3.1 Web Api项目中使用System.Text.Json将XmlDocument序列化为Json

San*_*son 5 c# xmldocument json.net system.text.json asp.net-core-3.1

我正在 .net Core 3.1 Web api 项目中从 Newtonsoft.Json 切换到 System.Text.Json。该项目是一个遗留的 .net core Web api 项目,拥有数百个客户端。某些控制器端点返回 XmlDocuments。使用 Newtonsoft.Json 将 XmlDocuments 序列化为 Json 工作正常并给出了预期结果。不幸的是,当切换到 System.Text.Json 时,序列化的工作方式有所不同。

例子 ;使用 System.Xml;

public class Program
{
    public static void Main()
    {
        var xml = @"<root><items><item id=""1"">item 1</item><item id=""2"">item 2</item></items></root>";
        var xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(xml);        
        Console.WriteLine($"Xml: {xml}");
        Console.WriteLine($"XmlDocument xml: {xmlDoc.ToString()}");
        
        var serializedXml = System.Text.Json.JsonSerializer.Serialize(xmlDoc);
        Console.WriteLine($"Serialized xml using System.Text.Json: {serializedXml}");
        
        serializedXml = Newtonsoft.Json.JsonConvert.SerializeObject(xmlDoc);
        Console.WriteLine($"Serialized xml using Newtonsoft.Json: {serializedXml}");
    }
}
Run Code Online (Sandbox Code Playgroud)

.net 小提琴手示例

结果

Xml: <root><items><item id="1">item 1</item><item id="2">item 2</item></items></root>
XmlDocument xml: System.Xml.XmlDocument
Serialized xml using System.Text.Json: [[[[[]],[[]]]]]
Serialized xml using Newtonsoft.Json: {"root":{"items":{"item":[{"@id":"1","#text":"item 1"}, 
{"@id":"2","#text":"item 2"}]}}}
Run Code Online (Sandbox Code Playgroud)

除了以下方法之外,还有什么方法可以使用 System.Text.Json 自动序列化 .net Core 3.1 Web api 中的 XmlDocuments:

  1. 使用 Newtsoft.Json 序列化器作为整个项目的标准
  2. 创建自定义 XmlDocument TextOutputFormatter 并将其添加到输出格式化程序