JQ将逗号转换为将JSON对象分离为数组



我有具有n个json对象的文件,它们被逗号分隔(,(

{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...

我想使用jq

将它们转换为一个带有n个对象的JSON数组
[{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2} ...]

我尝试了jq -R 'split(",")' myfile.json,但它给了我一系列n个字符串

[
  "{"a":1}",
  "{"b":2}",
  "{"a":1}",
  "{"b":2}",
  "{"a":1}",
  "{"b":2}",
  "{"a":1}",
  "{"b":2}" ....
]

有什么想法?

您在正确的轨道上,您只需要将fromjson映射到数组,例如:

jq -Rc 'split(",") | map(fromjson)' myfile.json

输出:

[{"a":1},{"b":2},{"c":3},{"d":2},{"e":1},{"f":2}]

但是,如果您要处理大量输入,也许使用更流的命令将输入分为块,例如使用tr

<myfile.json tr ',' 'n' | jq -c .

输出:

{"a":1}
{"b":2}
{"c":3}
{"d":2}
{"e":1}
{"f":2}

由于您有数百万这些JSON对象,让我首先提出一种有效的方法,以JSON-LINES格式产生它们的流(即,以" Newline"为定界符(。

警告:以下假定对象不包含带有逗号的JSON字符串。

让我们假设逗号分隔对象在名为objects.txt的文件中。首先,创建一个文件,program.jq,并使用以下JQ程序:

def one:
  (try input catch null)
  | if . == 0 then empty elif . == null then one else (., one) end;
one

然后假设您的外壳允许,请调用:

 (cat objects.txt; echo 0) |
   sed $'s/,/,\n/g' | 
   jq -n -c -f program.jq objects.txt

每行将产生流,一个JSON对象。这是一种非常可管理的格式。例如,要产生一个阵列,您可以将上述流将上述流动到jq -s .

但是,如果目标仅生成一个JSON数组,那么如其他地方指出的那样,最有效的方法是将逗号分隔的对象包装在正方形括号中,沿着:

的线
(echo "["; cat objects.txt; echo "]")

那么,这里的相关问题也许是:真正的目标是什么?令人怀疑的是,拥有大量的小JSON对象可能比原始逗号分隔的序列或简单的流更有用。

最新更新