我有这个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)}))
)
答案 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
]
}
]