如何让JSON序列化器忽略模型特性,按属性名反序列化?
解决方案
针对Newtonsoft.Json(处理模型A)
要忽略模型上的JsonProperty特性,直接按属性实际名称匹配JSON字段,可以通过自定义IContractResolver实现:
public class IgnoreJsonPropertyContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { var property = base.CreateProperty(member, memberSerialization); // 忽略JsonProperty特性指定的名称,强制使用属性本身的名称 property.PropertyName = member.Name; return property; } }
使用时将自定义解析器传入序列化配置:
var settings = new JsonSerializerSettings { ContractResolver = new IgnoreJsonPropertyContractResolver(), // 可选:开启大小写不敏感匹配,兼容JSON字段与属性名的大小写差异 // PropertyNameCaseInsensitive = true }; var json = "{\"PropertyOne\":\"some value\"}"; var modelA = JsonConvert.DeserializeObject<A>(json, settings);
针对System.Text.Json(处理模型B)
要忽略JsonPropertyName特性,直接按属性实际名称映射,需要自定义JsonTypeInfoResolver修改属性名称配置:
public class IgnoreJsonPropertyNameResolver : DefaultJsonTypeInfoResolver { public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options) { var typeInfo = base.GetTypeInfo(type, options); foreach (var property in typeInfo.Properties) { // 忽略JsonPropertyName特性,强制使用属性本身的名称 property.Name = property.PropertyInfo?.Name ?? property.Name; } return typeInfo; } }
使用时在序列化选项中指定自定义解析器:
var options = new JsonSerializerOptions { TypeInfoResolver = new IgnoreJsonPropertyNameResolver(), // 可选:开启大小写不敏感匹配,提升兼容性 // PropertyNameCaseInsensitive = true }; var json = "{\"PropertyOne\":\"some value\"}"; var modelB = JsonSerializer.Deserialize<B>(json, options);
补充说明
两种方案均无需修改原有模型,完全通过序列化器配置实现特性忽略;若JSON字段与属性名存在大小写差异,可开启对应序列化器的大小写不敏感匹配选项。
内容的提问来源于stack exchange,提问作者LilacBlue
相关产品推荐
相关产品推荐

