结构体!=运算符失效及Xml序列化属性复用Json序列化问题
问题2:将 XmlSerializer 特性映射到 Json 序列化
你的思路完全正确,通过继承 DefaultContractResolver 来读取Xml特性并同步配置Json属性是最优方案。下面是补全后的完整实现,支持 XmlElement、XmlArray、XmlAttribute 和 XmlIgnore 等常用Xml特性的映射:
完整的 XmlToJsonContractResolver 实现
using System.Reflection; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; using System.Xml.Serialization; public class XmlToJsonContractResolver : DefaultContractResolver { // 重写CreateProperty,为每个成员应用Xml特性的配置 protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var jsonProperty = base.CreateProperty(member, memberSerialization); ConfigurePropertyFromXmlAttributes(member, jsonProperty); return jsonProperty; } private void ConfigurePropertyFromXmlAttributes(MemberInfo member, JsonProperty jsonProperty) { // 处理XmlIgnore:直接忽略该成员的Json序列化 var xmlIgnore = member.GetCustomAttribute<XmlIgnoreAttribute>(); if (xmlIgnore != null) { jsonProperty.Ignored = true; return; } // 处理XmlElement:将Xml元素名称映射为Json属性名 var xmlElement = member.GetCustomAttribute<XmlElementAttribute>(); if (xmlElement != null && !string.IsNullOrWhiteSpace(xmlElement.ElementName)) { jsonProperty.PropertyName = xmlElement.ElementName; return; } // 处理XmlArray:针对集合类型,将Xml数组名称映射为Json属性名 var xmlArray = member.GetCustomAttribute<XmlArrayAttribute>(); if (xmlArray != null && !string.IsNullOrWhiteSpace(xmlArray.ElementName)) { jsonProperty.PropertyName = xmlArray.ElementName; return; } // 处理XmlAttribute:将Xml属性名称映射为Json属性名 var xmlAttribute = member.GetCustomAttribute<XmlAttributeAttribute>(); if (xmlAttribute != null && !string.IsNullOrWhiteSpace(xmlAttribute.AttributeName)) { jsonProperty.PropertyName = xmlAttribute.AttributeName; } } }
使用方式
在序列化时,将自定义解析器传入 JsonSerializerSettings 即可:
var settings = new JsonSerializerSettings { ContractResolver = new XmlToJsonContractResolver(), Formatting = Formatting.Indented // 可选:美化Json格式,方便阅读 }; // 示例:序列化带有Xml特性的类 var user = new User { Id = 1, Name = "Alice", Roles = new List<string> { "Admin", "User" } }; string json = JsonConvert.SerializeObject(user, settings);
补充说明
- 特性优先级:代码按
XmlIgnore→XmlElement→XmlArray→XmlAttribute的顺序处理,你可以根据业务需求调整优先级 - 集合适配:
XmlArray特性会直接映射到Json的数组属性名,Json.NET会自动处理集合内容的序列化,无需额外配置 - 扩展空间:如果需要支持
XmlArrayItem或IsNullable等Xml特性的细节,可以在方法中添加对应逻辑,比如设置jsonProperty.NullValueHandling
内容的提问来源于stack exchange,提问作者MakePeaceGreatAgain
相关产品推荐
相关产品推荐

