.NET中System.Text.Json如何支持区分大小写的属性名?
解决System.Text.Json中区分大小写属性名的冲突问题
问题根源
出现该冲突是因为你同时设置了全局PropertyNamingPolicy = JsonNamingPolicy.CamelCase,并通过JsonPropertyName指定了大小写不同的属性名。尽管JsonPropertyName优先级高于全局命名策略,但系统内部对JSON属性名的唯一性检查默认忽略大小写,再加上全局策略的干扰,导致两个大小写不同的属性被判定为重复。
解决方案
方案1:移除全局命名策略(推荐)
若仅需这两个属性区分大小写,其他属性无需统一命名规则,直接移除全局PropertyNamingPolicy配置即可:
修改后的JsonSerializerOptions:
public static JsonSerializerOptions Default => new() { PropertyNameCaseInsensitive = false, // 移除PropertyNamingPolicy = JsonNamingPolicy.CamelCase WriteIndented = false, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull };
此时,通过JsonPropertyName指定的"statusCode"和"StatusCode"会被系统正确识别为不同属性,PropertyNameCaseInsensitive = false也会确保反序列化时严格区分大小写。
方案2:保留全局策略(适用于其他属性需camelCase的场景)
如果其他属性需要统一使用camelCase命名,可保留全局策略,但需确保.NET版本为.NET 6及以上(该版本对JsonPropertyName优先级的处理更稳定):
属性定义保持不变:
[JsonPropertyName("statusCode")] public string? StatusCode { get; set; } [JsonPropertyName("StatusCode")] public string? AbcApiStatusCode { get; set; }
JsonSerializerOptions配置:
public static JsonSerializerOptions Default => new() { PropertyNameCaseInsensitive = false, PropertyNamingPolicy = JsonNamingPolicy.CamelCase, WriteIndented = false, DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull };
内容的提问来源于stack exchange,提问作者Wasim
相关产品推荐
相关产品推荐

