从无效的 json 中删除尾随逗号(以使其有效)

从无效的 json 中删除尾随逗号(以使其有效)

假设我有一个如下文件

{
    "fruit": "Apple",
}

当且仅当下一行包含“}”时,我想删除行末尾的逗号。所以,输出将是:

{
    "fruit": "Apple"
}

但是,如果文件如下所示。我不想做任何改变。由于,s 后面没有跟}

{
    "fruit": "Apple",
    "size": "Large",
    "color": "Red"
}

任何有 sed 的东西都会很棒。

答案1

造成这个问题的原因在于 JSON 格式不关心键或数据中不出现的空格。所以,

{ "key": "data" }

是相同的

{ "key":
"data"
}

如果添加“损坏”JSON 文件的可能性,例如

{ "key":
"data", }

除了知道如何在解析数据时放松 JSON 格式的限制的 JSON 解析器之外,使用其他任何东西来正确解析文档变得非常困难。

PerlJSON模块可以做到这一点,并且还可以漂亮地打印结果:

$ cat file.json
{
    "fruit": "Apple",
}
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}), {pretty=>1})' file.json
{
   "fruit" : "Apple"
}

在这里,我们将整个文本文档读入数组中@text。然后,我们在放松解析的同时对其进行解码(这使得 JSON 文档可以在前面有逗号}]并且还可以包含#注释)。然后我们立即将生成的 Perl 数据结构再次编码为 JSON 并打印它。

另一个例子:

$ cat file.json
{
    "fruit": "Apple",   # a comment
    "stuff": [1, 2, 3,],
}
$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}), {pretty=>1})' file.json
{
   "fruit" : "Apple",
   "stuff" : [
      1,
      2,
      3
   ]
}

没有漂亮的印刷:

$ perl -MJSON -e '@text=(<>);print to_json(from_json("@text", {relaxed=>1}))' file.json
{"fruit":"Apple","stuff":[1,2,3]}

(输出末尾没有换行符)

对于非常大的文档,您可能需要使用模块的增量解析功能并编写适当的转换脚本。

答案2

sed -i.bak ':begin;$!N;s/,\n}/\n}/g;tbegin;P;D' FILE

sed -i.bak= 创建原始文件的备份,然后将更改应用于该文件

':begin;$!N;s/,\n}/\n}/g;tbegin;P;D'= 任何以,其次是新行和}。去除,在上一行

FILE= 您要更改的文件

答案3

使用JSON5从 Node.js 应用程序或作为 CLI 实用程序(npm install --global json5自制配方):

json5 -s 2 file.json

与 @Kusalananda 基于 Perl 的解决方案相比,使用 JSON5 的优点是可以保留对象键排序。

相关内容