【问题标题】:jq convert comma separated JSON objects into arrayjq 将逗号分隔的 JSON 对象转换为数组
【发布时间】:2018-09-13 16:19:25
【问题描述】:

我有包含 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}" ....
]

有什么想法吗?

【问题讨论】:

  • 将您的输入包装在 [.....] 中可能是最简单的
  • 我的文件包含数百万个json对象,也许它不是读取整个文件的有效方法?
  • 请说明任何 JSON 对象是否可能包含多个键,以及任何键名称或值是否可能包含逗号。

标签: json object jq


【解决方案1】:

你在正确的轨道上,你只需要将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}

【讨论】:

    【解决方案2】:

    由于您拥有数百万个这样的 JSON 对象,我首先建议一种有效的方法来生成 JSON-Lines 格式的流(即,使用“换行符”作为分隔符)。

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

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

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

    然后假设你的 shell 允许它,调用:

     (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 对象数组可能更有用,这似乎值得怀疑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2021-10-30
      • 1970-01-01
      相关资源
      最近更新 更多