【问题标题】:why does jq print records redundantly and mismatched and how to fix it?为什么 jq 打印记录冗余且不匹配以及如何解决?
【发布时间】:2020-06-04 15:54:30
【问题描述】:

我有一个包含六个“发票”对象的 json 文件,每个对象是 140 多行值。我只想查看六个对象中每个对象的几个值。 jq 似乎是一个很有前途的解决方案。

我正在使用jq version 1.5-1-a5b5cbe,它可以通过apt 的常用存储库获得。

我可以做cat stripe-invoices-list.json | jq -C '. | {invoice_id: .data[].id,}' 并且它返回:

{
  "invoice_id": "in_1Gq39HFGUwFHXzvlUOGG3Rv4"
}
{
  "invoice_id": "in_1GpyM1FGUwFHXzvlio9pfaM9"
}
{
  "invoice_id": "in_1GpyHUFGUwFHXzvlHDS727su"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5"
}

这是有道理的并且可以正常工作。这些是六个发票对象的 ID。一切都很好,虽然只是看到 id 并没有帮助。所以...

我尝试向输出中添加更多数据,但随后会产生冗余甚至不正确的输出:

$ cat stripe-invoices-list.json | jq -C '. | {invoice_id: .data[].id, client: .data[].customer_name,}'

结果:

{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_two"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_three"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_four"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_five"
}
{
  "invoice_id": "in_1Gpy4HFGUwFHXzvl6k82godp",
  "client": "client_one"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_one"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_two"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_three"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_four"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_five"
}
{
  "invoice_id": "in_1GpjNjFGUwFHXzvl880gp0o9",
  "client": "client_one"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_one"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_two"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_three"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_four"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_five"
}
{
  "invoice_id": "in_1GSkk7FGUwFHXzvlfWdhcad5",
  "client": "client_one"

它提供了冗余和混乱的信息。这是多余的,因为in_1GSkk7FGUwFHXzvlfWdhcad5 被多次列出,并且因为一张发票与每个客户相关联而被打乱。

当我在 vim 中打开 stripe-invoices-list.json 文件时,我可以看到发票 ID in_1GSkk7FGUwFHXzvlfWdhcad5client_one 相关联。

任何人都可以提出可能导致此问题的原因,或者我可以采取的任何调试步骤吗? 如何让jq 正确打印?

【问题讨论】:

    标签: json jq


    【解决方案1】:

    这是一个常见的陷阱,您在同一个对象构造函数中将data 扩展了两次,它会导致combinatorial explosion。下面是正确的做法。

    .data[] | {invoice_id: .id, client: .customer_name}
    

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-23
      相关资源
      最近更新 更多