在Jq中如何将元组的json数组扩展为多个元素

时间:2017-10-13 08:35:23

标签: python json jq

我有这个json字符串

{"op":"mcm","clk":"1147179697","pt":1439869512969,
   "mc":[ {"id":"1.120040663",
           "rc":[
                  {"atb":[[7.6,35],[7.2,25]],"id":11111},
                  {"atb":[[1.04,100],[1.02,200]],"id":22222}
                ],
           "con":true,
           "img":false}
        ]}

并且需要将atb元素与id:

一起提取到价格和金额中
[{
"atb_price": [7.6, 7.2]
"atb_amount": [35, 25]
"atb_id": [11111, 11111]
},
{
"atb_price": [1.04, 1.02]
"atb_amount": [100, 200]
"atb_id": [22222, 22222]
}]

到目前为止,我有这些过滤器让我有一些方法,但不完全 1.给出所有价格/金额/价值的组合。

(.mc[].rc | map({"prices":.atb[][0], "vol":.atb[][1], "id":.id}))  

2。 id元素仍在数组之外。

.mc[].rc | map( {"id":.id, "atb": ( .atb | map({ "amount":  .[1],  "price":.[0] }) )[] } )

非常感谢任何帮助。

修改 最后,我稍微修改了其中一个答案,因为我的json字符串比最初的想法更复杂,在某些情况下,还有 trd 元素要处理。

{"op":"mcm","clk":"1147179697","pt":1439869512969,
   "mc":[ {"id":"1.120040663",
           "rc":[
                  {"atb":[[7.6,35],[7.2,25]],"id":11111},
                  {"atb":[[1.04,100],[1.02,200]],"id":22222}
                  {"trd":[[1.04,100],[1.02,200]],"id":22222}
                ],
           "con":true,
           "img":false}
        ]}

解决方案,

(. | del(.mc))
+ (.mc[] | del(.rc))
+ (.mc[].rc[] 
| .id as $id | .ltp as $ltp | .tv as $rtv
| (select(.atl) | (.atl | {"atl.price": map(.[0]), "atl.volume": map(.[1]), "runner.id": map($id)})),
  (select(.atb) | (.atb | {"atb.price": map(.[0]), "atb.volume": map(.[1]), "runner.id": map($id)})),
  (select(.trd) | (.trd | {"trd.price": map(.[0]), "trd.volume": map(.[1]), "runner.id": map($id)}))
  )

2 个答案:

答案 0 :(得分:2)

简明扼要的解决方案:

.mc[].rc[]
| .id as $id
| .atb
| { atb_price:   map(.[0]),
    atb_amount:  map(.[1]),
    atb_id:      map($id) }

答案 1 :(得分:0)

jq 解决方案:

jq '[.mc[0].rc[] | .id as $id | reduce .atb[] as $i 
    ({"atb_price":[], "atb_amount":[], "atb_id": []}; 
     .atb_price += [$i[0]] | .atb_amount += [$i[1]] | .atb_id += [$id])]' jsonfile

输出:

[
  {
    "atb_price": [
      7.6,
      7.2
    ],
    "atb_amount": [
      35,
      25
    ],
    "atb_id": [
      11111,
      11111
    ]
  },
  {
    "atb_price": [
      1.04,
      1.02
    ],
    "atb_amount": [
      100,
      200
    ],
    "atb_id": [
      22222,
      22222
    ]
  }
]