You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:10:52