【问题标题】:How to join JSON objects on particular fields using jq?如何使用 jq 在特定字段上加入 JSON 对象?
【发布时间】:2019-06-27 15:34:24
【问题描述】:

我有以下 JSON 结构:

{
  "Reservations": [
    {
      "Id": "R-1",
      "CustomerId": "1"
    },
    {
      "Id": "R-2",
      "CustomerId": "2"
    }
  ],
  "Customers": [
    {
      "Id": "1",
      "Name": "customer 1"
    },
    {
      "Id": "2",
      "Name": "customer 2"
    },
    {
      "Id": "3",
      "Name": "customer 3"
    }
  ]
}

我想加入ReservationsCustomers 并得到这样的东西:

{
  "ReservationId": "R-1",
  "CustomerName": "customer 1"
}
{
  "ReservationId": "R-2",
  "CustomerName": "customer 2"
}

我已经广泛使用jq,尝试使用以逗号分隔的多个过滤器,尝试使用变量,阅读文档,但似乎使用jq 完成如此简单的任务是不可能的。或者,我错过了什么?

【问题讨论】:

    标签: json shell join command-line jq


    【解决方案1】:

    这是一个使用INDEX/2的简单解决方案:

    INDEX(.Customers[]; .Id) as $c
    | .Reservations[]
    | { ReservationId: .Id,
        CustomerName: $c[.CustomerId].Name }
    

    如果你的 jq 没有INDEX/2 那么现在是升级的好时机;否则,您可以从https://github.com/stedolan/jq/blob/master/src/builtin.jq 复制并粘贴其def,或者您可以使用INDEX/3,定义如下。

    索引/3

    def INDEX(s; k; v):
      reduce s as $x ({}; .[$x|k] = ($x|v));
    
    INDEX(.Customers[]; .Id; .Name) as $c
    | .Reservations[]
    | { ReservationId: .Id,
        CustomerName: $c[.CustomerId] }
    

    【讨论】:

    • 谢谢。会尝试。没有 SQL 风格的运算符有什么办法吗?
    • INDEX/2 是 SQL 风格的运算符吗?它只是创建了一个字典,它使一切变得高效和直接,尽管不如使用 INDEX/3 高效和直接:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-12
    • 2018-11-16
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多