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

