如何将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
相关产品推荐
相关产品推荐

