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

JsonConvert.SerializeObject序列化丢失@符号,需保留@xm属性名

解决JsonConvert.SerializeObject序列化时保留属性名@符号的问题

C#里的@是标识符转义符,匿名类型中@xm编译后的实际属性名是xm,所以Json.NET默认序列化时会去掉@。要保留@xm的原样,有两种可行方案:

方案一:手动构建JObject指定键名

直接用JObject构造对象结构,显式添加带@的键名,避开匿名类型的编译转换:

var statementOfAccount = JObject.FromObject(new
{
    main = JObject.FromObject(new
    {
        RESTHeader = new
        {
            Responsibility = "Responsibility ",
            RespApplication = "AR",
            NLSLanguage = "AMERICAN"
        }
    })
    .Add("@xm", "https://api-path.com")
});

string json = JsonConvert.SerializeObject(statementOfAccount, Formatting.Indented);

序列化后@xm会被完整保留。

方案二:自定义ContractResolver修改属性名

通过自定义契约解析器,将编译后的xm属性名映射回@xm,无需修改原对象构造逻辑:

public class AtSignPreservingResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        // 针对目标属性调整序列化后的名称
        if (property.PropertyName == "xm")
        {
            property.PropertyName = "@xm";
        }
        return property;
    }
}

// 序列化时启用自定义解析器
var settings = new JsonSerializerSettings
{
    ContractResolver = new AtSignPreservingResolver(),
    Formatting = Formatting.Indented
};

var statementOfAccount = new
{
    main = new
    {
        @xm = "https://api-path.com",
        RESTHeader = new
        {
            Responsibility = "Responsibility ",
            RespApplication = "AR",
            NLSLanguage = "AMERICAN"
        }
    }
};

string json = JsonConvert.SerializeObject(statementOfAccount, settings);

这个方案适合需要保留原对象构造方式,仅通过序列化配置调整的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 13:45:33