如何在System.Text.Json中不使用JsonPropertyName映射下划线JSON到帕斯卡实体属性?
不用JsonPropertyName实现下划线JSON到帕斯卡实体的映射方案
方案1:自定义命名策略
System.Text.Json支持自定义命名策略,直接实现JsonNamingPolicy就能搞定命名转换:
- 写一个下划线转帕斯卡的策略类:
public class SnakeCaseToPascalCaseNamingPolicy : JsonNamingPolicy { public override string ConvertName(string name) { if (string.IsNullOrEmpty(name)) return name; // 按下划线分割,每个单词首字母大写后拼接 var parts = name.Split('_'); return string.Concat(parts.Select(part => char.ToUpperInvariant(part[0]) + part.Substring(1).ToLowerInvariant())); } }
- 序列化/反序列化时带上这个策略:
var options = new JsonSerializerOptions { PropertyNamingPolicy = new SnakeCaseToPascalCaseNamingPolicy(), WriteIndented = true // 可选,让输出格式更易读 }; // 反序列化示例 var json = "{\"user_name\":\"John\",\"email_address\":\"john@example.com\"}"; var user = JsonSerializer.Deserialize<User>(json, options); // 序列化示例 var serializedJson = JsonSerializer.Serialize(user, options);
方案2:利用内置蛇形策略反向适配(.NET 5+)
如果你的JSON是标准全小写下划线命名,.NET 5及以上版本有内置的JsonNamingPolicy.SnakeCaseLower,但它仅支持帕斯卡转蛇形的单向转换,要实现反向映射还是自定义策略更直接。
额外注意点
- 自定义策略是全局生效的,要是只有部分属性需要转换,这种方式会影响所有属性。这种场景可以结合
JsonExtensionData处理个别字段,但如果大部分字段都是下划线转帕斯卡,全局策略的效率更高。 - 要是有个别特殊字段需要单独映射,又不想用JsonPropertyName,直接在自定义策略里加例外逻辑就行:
public override string ConvertName(string name) { // 例外字段:实体属性名对应JSON键 var exceptions = new Dictionary<string, string> { { "SpecialField", "special_custom_key" } }; if (exceptions.TryGetValue(name, out var jsonKey)) return jsonKey; // 其他字段走下划线转帕斯卡逻辑 var parts = name.Split('_'); return string.Concat(parts.Select(part => char.ToUpperInvariant(part[0]) + part.Substring(1).ToLowerInvariant())); }
内容的提问来源于stack exchange,提问作者user14208541
相关产品推荐
相关产品推荐

