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

{
  "a": 1
}

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

在我的情况下,最有效的方式是最小化一个JSON字符串?例如
{"a":1}

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

最佳答案

Regex.Replace(myJSON, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1")

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

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

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

因此,我们匹配整个字符串,并在字符串外部匹配空格。在前一种情况下,$1是字符串标记,而在后一种情况下,由于没有使用组1,因此$1是空字符串。

这按预期工作,因为
  • JSON中唯一可以包含空格的标记是双引号字符串。 JSON中没有单引号字符串或注释。
  • JSON语法要求所有多字符标记之间使用单字符标点,因此删除空间不会合并标记。在JavaScript中,这可能会引起问题,因为需要空间来破坏 token 。 var x=0varx=0不同,并且x - -(y)x--(y)不同。
  • 10-07 19:27
    查看更多