【问题标题】:Convert key=value string to JSON将 key=value 字符串转换为 JSON
【发布时间】:2016-12-14 01:49:30
【问题描述】:

我有以下格式的键和值字符串:

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

【问题讨论】:

  • 你想生成什么格式的JSON?
  • 一个复杂的解决方案。开始编写逻辑,人们会提供帮助的。你需要某种插件,它将无效转换为最接近的有效 json 字符串(对于 c#)

标签: c# json regex


【解决方案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}";

正则表达式解释:

  • (?&lt;key&gt; - 启动一个名为 key 的捕获组
    • [^=,\s]+ - 匹配除=, 和空格之外的任何非空字符序列
    • ) - 结束 key
  • = - 从字面上匹配等号
  • (?: - 启动一个未命名的组,用于对备选方案进行分组
    • 第一个选择 - 引用值:
    • " - 开场白
    • (?&lt;value&gt; - 启动一个名为 value 的捕获组
      • (?:[^"]|""[^"]*"")* - 匹配任何非引号序列或带引号的字符串(请不要将引号加倍)
      • ? - 使之前的匹配不贪心
      • ) - 结束 value
    • " - 文字结束引号
    • | - 替代分隔符
    • 第二种选择 - 未引用的值:
    • (?&lt;value&gt; - 启动另一个 value 捕获组 - .NET 正则表达式风格维护一组命名组,因此您可以简单地按名称访问任一替代捕获组
      • [^,]* - 匹配任何不包含逗号的序列
      • ) - 结束第二个 value
    • ) - 结束未命名的组
  • (?:,|$) - 匹配逗号或字符串结尾(都应完成值)

【讨论】:

  • 这几乎可以工作,谢谢!但是我在问题的初始修订中错过了一个重要细节:值内可以有引号。请看我的编辑。
  • 是的,我刚刚注意到了变化。在这种情况下,您必须转义 m.Groups["value"].Value。最简单的方法可能是使用JsonConver.ToString()。我会更新答案。
  • 哦,对 KEY4 值的处理不太好。我会再回来更新...
  • 我认为"(?&lt;value&gt;[^"]*)" => "(?&lt;value&gt;[^"]*|"")*" 应该可以解决问题。
  • @AndreBorges,更新支持嵌套引用字符串。希望这会有所帮助。
【解决方案2】:

如你所说,你可以使用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"
}

【讨论】:

  • 不要直接复制。发送答案前请小心
  • 事实上,我还没有测试过,但我猜这段代码可以工作。
  • 代码有效,但没有以任何方式回答问题
猜你喜欢
  • 2014-06-07
  • 1970-01-01
  • 2020-06-29
  • 2020-07-21
  • 1970-01-01
  • 2016-04-17
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多