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

结构体!=运算符失效及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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:47:18