将key=value字符串转换为JSON

本文关键字:转换 JSON 字符串 value key | 更新日期: 2023-09-27 18:01:20

我有一个键和值的字符串,格式如下:

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

如何使用c#将其转换为JSON字符串?这可能可以使用Regex完成,但我不能提出正确的模式。我也不知道如何使用像Newtonsoft.Json这样的库来做到这一点。

我想生成的JSON如下:

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

将key=value字符串转换为JSON

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

假设我们限制自己只有一层嵌套的引号字符串,正则表达式将是:

(?<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风味维护了一个命名组堆栈,因此您可以简单地通过名称访问可选的捕获组
      • [^,]* -匹配任何不包含逗号的序列
      • ) -结束第二个value
    • ) -结束未命名组
  • (?:,|$) -匹配逗号或字符串的结尾(两者都期望完成值)

您可以使用您所说的Newtonsoft

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

函数中的用法

public string ConvertJSON()
{
    Person p = new Person();
    p.FirstName = "Khan";
    p.LastName = "Imran";
    string json = "";
    return json = JsonConvert.SerializeObject(p);
}

{
  "FirstName": "Khan",
  "LastName" : "Imran"
}