将key = value字符串转换为JSON

时间:2016-08-08 10:16:33

标签: c# json regex

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

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\"!" 
}

2 个答案:

答案 0 :(得分:1)

好吧,使用更新后的问题中的嵌套引号会变得比较棘手。我看不到用任意级别的嵌套引号提取值的任何可行方法。 (对于正则表达式方法也是如此 - 仍然可以手动扫描字符串并计算与嵌套级别相关的后续引号数。)

假设我们仅使用一级嵌套引用字符串来限制自己,那么正则表达式将是:

(?<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正则表达式使用一堆命名组来管理,这样您就可以通过名称访问其中一个备用捕获组
      • [^,]* - 匹配任何不包含逗号的序列
      • ) - 结束第二个value群组
    • ) - 结束未命名的群组
  • (?:,|$) - 匹配逗号或字符串结尾(两者都可以完成该值)

答案 1 :(得分:-3)

您可以按照说法使用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"
}