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

如何将XML序列化为POCO再转JSON?解决类型与空值等问题

解决方案

一、先将XML反序列化为强类型POCO(核心步骤)

直接操作XmlDocument转JSON会丢失类型信息,必须先把XML映射到继承自TObjects的强类型派生类(如PAC、CCS),从根源解决整数转字符串的问题。

  • 定义带XML序列化特性的POCO类:
    public class TObjects { }
    
    [XmlRoot("PAC")]
    public class PAC : TObjects
    {
        [XmlElement("Id")]
        public int Id { get; set; }
    
        [XmlElement("Name")]
        public string Name { get; set; }
    
        [XmlElement("Description")]
        public string Description { get; set; }
    }
    
  • 实现XML到POCO的反序列化方法:
    public static T DeserializeXmlToPoco<T>(string xmlContent) where T : TObjects
    {
        var serializer = new XmlSerializer(typeof(T));
        using var stringReader = new StringReader(xmlContent);
        return (T)serializer.Deserialize(stringReader);
    }
    

二、配置Newtonsoft.Json生成目标JSON格式

针对忽略空值、类名为根节点、支持派生类的需求,通过配置序列化参数实现:

  • 核心配置与序列化逻辑:
    public static string ConvertPocoToTargetJson(TObjects pocoInstance)
    {
        var jsonSettings = new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore, // 忽略空值属性
            Formatting = Formatting.Indented,
            TypeNameHandling = TypeNameHandling.Auto // 自动识别派生类类型(可选,若需反序列化回对应子类)
        };
    
        // 以类名为根节点包装POCO的JSON结果
        var rootJson = new JObject();
        var pocoJson = JObject.FromObject(pocoInstance, JsonSerializer.Create(jsonSettings));
        rootJson.Add(pocoInstance.GetType().Name, pocoJson);
    
        return rootJson.ToString();
    }
    

三、处理XML空值问题

XML中的空元素(如<Description/>)或无值属性,会被XmlSerializer反序列化为null或类型默认值,配合NullValueHandling.Ignore配置,这些空值会自动从最终JSON中剔除。若需更精细控制,可在POCO属性上添加[DefaultValue("")]特性,或自定义XML反序列化逻辑。

四、完整流程示例

// 示例XML输入
var sampleXml = @"<PAC>
                    <Id>456</Id>
                    <Name>SamplePAC</Name>
                    <Description/>
                </PAC>";

// 1. XML转强类型POCO
var pacObject = DeserializeXmlToPoco<PAC>(sampleXml);

// 2. POCO转目标格式JSON
var targetJson = ConvertPocoToTargetJson(pacObject);

输出的目标JSON:

{
  "PAC": {
    "Id": 456,
    "Name": "SamplePAC"
  }
}

内容的提问来源于stack exchange,提问作者MB34

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 09:05:01