gpt4 book ai didi

c# - 将 key=value 字符串转换为 JSON

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:24 24 4
gpt4 key购买 nike

我有一串键和值,格式如下:

KEY1=someValue, KEY2="Hello, World!", SOME.OTHER.KEY=Hello World!, KEY4="Hello, ""World""!"

如何使用 C# 将其转换为 JSON 字符串?这可能可以使用正则表达式来完成,但我想不出正确的模式。我也无法弄清楚如何使用像 Newtonsoft.Json 这样的库来做到这一点。

我要生成的 JSON 如下:

{
"KEY1":"someValue",
"KEY2":"Hello, World!",
"SOME.OTHER.KEY":"Hello World!",
"KEY4":"Hello, \"World\"!"
}

最佳答案

好吧,使用更新问题中的嵌套引号,事情变得更加棘手。我看不到任何可行的方法来提取具有任意级别的嵌套引号的值。 (正则表达式方法也是如此——仍然可以手动扫描字符串并根据嵌套级别计算后续引号的数量。)

假设我们只使用一层嵌套引用字符串来限制自己,则正则表达式为:

(?<key>[^=,\s]+)=(?:"(?<value>(?:[^"]|""[^"]*"")*?)"|(?<value>[^,]*))(?:,|$)

然后您可以找到所有匹配项并根据 JSON 规则重新格式化对:

var input = @"KEY1=someValue, KEY2=""Hello, World!"", 
SOME.OTHER.KEY=Hello ""World""!,
KEY4=""Hello, """"World""""!"",
KEY5=""Hello, """"World""""!"",
KEY6=""""""Hello"""", """"World""""!""";
var pairs = Regex.Matches(input, @"(?<key>[^=,\s]+)=(?:""(?<value>(?:[^""]|""""[^""]*"""")*?)""|(?<value>[^,]*))(?:,|$)")
.Cast<Match>()
.Select(m =>
string.Format(" {0}: {1}",
JsonConvert.ToString(m.Groups["key"].Value),
JsonConvert.ToString(m.Groups["value"].Value.Replace("\"\"", "\""))));
var json = "{\n" + string.Join(",\n", pairs) + "\n}";

正则解释:

  • (?<key> - 启动一个名为 key 的捕获组
    • [^=,\s]+ - 匹配任何非空字符序列,不包括 = , , , 和空格
    • ) - 结束 key小组
  • = - 按字面匹配等号
  • (?: - 启动一个未命名的组,用于对备选方案进行分组
    • 第一个选择 - 引用值:
    • " - 开场白
    • (?<value> - 启动一个名为 value 的捕获组
      • (?:[^"]|""[^"]*"")* - 匹配任何非引号序列或带引号的字符串(请不要将引号加倍)
      • ? - 使之前的匹配成为非贪婪的
      • ) - 结束 value小组
    • " - 字面的结束语
    • | - 选项分隔符
    • 第二个选择 - 不带引号的值:
    • (?<value> - 开始另一个 value捕获组 - .NET regex flavor 维护了一堆命名组,因此您可以简单地通过名称访问任一替代捕获组
      • [^,]* - 匹配任何不包含逗号的序列
      • ) - 结束第二个value小组
    • ) - 结束未命名组
  • (?:,|$) - 匹配逗号或字符串结尾(两者都应完成值)

关于c# - 将 key=value 字符串转换为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38826620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com