如何用C#正则表达式移除JSON属性名中的连字符?
如何用正则移除JSON属性名中的连字符(保留属性值内的连字符)
下面提供两种可行方案,同时补充后续发现的实际问题根源及更优解决方式:
方案一:通用移除所有JSON属性名的连字符
核心思路是精准锁定JSON属性名(冒号左侧的带引号字符串),仅在该范围内移除连字符,完全不影响属性值里的内容。
实现逻辑
通过正则的分组匹配锁定属性名区域,再对分组内的内容移除连字符:
- 正则表达式:
(@"("")(?<key>[^""]+)(""\s*:)" - 替换逻辑:提取匹配到的属性名分组,去掉其中的
-后再拼接回原格式
以C#为例,代码示例:
string rawJson = @"你的原始JSON字符串"; string processedJson = Regex.Replace(rawJson, @"("")(?<key>[^""]+)(""\s*:)", m => $"{m.Groups[1].Value}{m.Groups["key"].Value.Replace("-", "")}{m.Groups[2].Value}");
用你的输入JSON测试,会精准移除monthly-amount等属性名的连字符,同时保留id、name值里的连字符。
方案二:仅处理指定的属性名
如果只需要处理"monthly-amount"、"annual-amount"、"ask-for-shipping-address"这几个特定属性,直接做字符串替换更简单:
string rawJson = @"你的原始JSON字符串"; var targetKeys = new[] {"monthly-amount", "annual-amount", "ask-for-shipping-address"}; foreach (var key in targetKeys) { rawJson = rawJson.Replace($"\"{key}\"", $"\"{key.Replace("-", "")}\""); }
这种方式逻辑直观,适合属性数量较少的场景。
实际问题修正(编辑补充)
后续发现根本不需要修改JSON字符串,问题出在JsonConstructor参数命名错误:
之前误解了规则,以为构造函数参数名要和JSON里的带连字符属性名匹配,但实际规则是:
- JsonConstructor的参数名只需和C#类的实际属性名匹配(大小写不敏感)
- 反序列化器会自动通过参数名找到对应的
JsonPropertyName属性,匹配JSON中的带连字符名称
举个正确的示例:
public class BillingInfo { [JsonPropertyName("monthly-amount")] public int MonthlyAmount { get; set; } [JsonConstructor] public BillingInfo(int monthlyAmount) // 参数名和类属性名一致,无需带连字符 { MonthlyAmount = monthlyAmount; } }
按这个方式定义后,直接反序列化原始JSON即可,完全不需要修改JSON内容。
内容的提问来源于stack exchange,提问作者DhyMik
相关产品推荐
相关产品推荐

