【问题标题】:Minify indented JSON string in .NET在 .NET 中缩小缩进的 JSON 字符串
【发布时间】:2012-02-13 08:23:32
【问题描述】:

我有一个缩进的 JSON 字符串,例如

{
  "a": 1
}

但是,我没有要序列化或反序列化的实例类型。

在我的情况下,最有效的方法 缩小 JSON 字符串是什么?例如

{"a":1}

我不介意使用可用于生产的库。

【问题讨论】:

    标签: .net string json minify


    【解决方案1】:
    Regex.Replace(myJSON, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1")
    

    应该这样做。它确保保留包含空格字符的字符串,并丢弃所有其他空格字符。所有 JSON 关键字(falsetruenull)都必须用逗号或其他标点符号分隔,因此只需要保留字符串中的空格。


    第一个选项(\"(?:[^\"\\\\]|\\\\.)*\") 匹配双引号字符串。 (...) 表示输出已被捕获并可作为$1 替换。 [^\"\\\\] 匹配除双引号或转义字符 \ 之外的任何字符。

    由于从左到右进行匹配,第二个选项\s+ 不会匹配字符串中的空格。

    所以我们匹配整个字符串,以及字符串之外的空格。在前一种情况下,$1 是字符串标记,在后一种情况下,$1 是空字符串,因为未使用组 1。


    这按预期工作,因为

    1. JSON 中唯一可以包含空格的标记是双引号字符串。 JSON 中没有单引号字符串或 cmets。
    2. JSON 语法要求所有多字符标记之间使用单字符标点符号,因此删除空格不会合并标记。在 JavaScript 中,这可能是有问题的,因为需要空间来打破标记; var x=0varx=0 不同,x - -(y)x--(y) 不同。

    【讨论】:

    • 我发现它作为 verbatim string @"(""(?:[^""\\]|\\.)*"")|\s+" 更易读 - 双引号而不是四斜杠
    【解决方案2】:

    下面的正则表达式对我有用。

    string json = @"{ 
                      "window": {
                      "title": "Sample Konfabulator Widget",
                      "name": "main_window",
                      "width": 500,
                      "height": 500
                      } 
                    }"
    
    Regex.Replace(json, @"\s(?=([^""]*""[^""]*"")*[^""]*$)", string.Empty);
    

    我在 .NET Core 应用程序项目中使用它。正则表达式来自that answer

    【讨论】:

    • 为什么投反对票?答案提供了响应者对 OP 的问题/问题的解决方案。
    猜你喜欢
    • 2018-11-11
    • 2013-11-19
    • 2020-06-25
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多