使用Regex移除Json属性名称中的勒胡号(C#)

xpszyzbs  于 2022-11-18  发布在  C#
关注(0)|答案(2)|浏览(150)

使用Regex,我想删除文本文件中特定的带引号单词中的所有连字符。
场景:这段代码中,我需要在使用JsonConstructor(不荣誉JsonPropertyName属性***请参见下面的编辑***)反序列化Json字符串之前,从Json属性名称中删除连字符。
需要删除连字符的单词列表示例(引号应是匹配的一部分):

"monthly-amount"
"annual-amount"
"ask-for-shipping-address"

示例输入Json:

{
  "id": "b9d7574f-5246-4c94-ade5-1d4e9b169afc",
  "name": "James-John Moonly-Batcher"
  "monthly-amount" : 2000,
  "annual-amount" : 12000,
  "ask-for-shipping-address" : false
}

预期输出Json:

{
  "id": "b9d7574f-5246-4c94-ade5-1d4e9b169afc",
  "name": "James-John Moonly-Batcher"
  "monthlyamount" : 2000,
  "annualamount" : 12000,
  "askforshippingaddress" : false
}

请注意,在此示例中,名称和ID值中的连字符未删除。
我知道如何匹配列表中的单词,但我不明白的是如何使用匹配的单词并替换其中的所有连字符。
或者,如果可以构造一个不需要单词列表的正则表达式,它可以替换任何属性名称中的连字符(但不能替换属性值中的连字符),这也是受欢迎的。
我很想在我剩下的小头发被刮掉之前收到一些关于这个任务的投入。

编辑:

只有在我成功地应用了公认的答案之后,我才意识到我最初的问题是一个完全不同的问题:用于反序列化的类构造函数(JSON构造函数)的参数名称错误。
我误解了docs中关于JsonConstructor的参数名需要如何设置的内容,认为JSON构造函数的参数名需要与JSON中的名称匹配,而实际上,JSON构造函数的参数名需要与C#类的实际属性名匹配通过匹配C#类的属性名称,反序列化程序可以找到与构造函数参数名称对应的JsonPropertyName属性,从而可以找到要查找的JSON名称。
因此,有了正确的参数名,就不需要首先更改Json属性名。

ep6jt1vc

ep6jt1vc1#

另一种方法是完全跳过正则表达式,并通过使用JsonNode API(自.NET 6起可用)引入中间步骤来更改属性名称:

var jsonObject = JsonNode.Parse(json).AsObject();
var toModify = jsonObject.Where(pair => pair.Key.Contains("-")).ToList();
foreach (var prop in toModify)
{
    var name = prop.Key;
    var value = prop.Value;
    var newName = name.Replace("-", "");
    jsonObject.Remove(name);
    jsonObject[newName] = value;
}

var result = jsonObject.Deserialize<...>();
06odsfpq

06odsfpq2#

LookaroundAssert可用于检查每个连字符处的某些条件。
例如,前瞻 * 可以检查后面是否没有双引号和冒号:

-(?=[^"]*"\s*:)

See this demo at regex101或www.example.com上的C#替换演示tio.run
或者是一个否定的lookbehind,用于检查该行之前是否没有冒号。

-(?<!:.+)

Another demo at regexstorm和www.example.com上的C#替换演示tio.run
Stackoverflow Regex FAQ是一个很好的解释资源。在这些模式中使用的是一个[^取反字符类]dot* and + quantifiersshorthand\s表示 * 空白 *。

相关问题