2017-10-13 3 views
0

j'ai cette chaîne JSONEn Jq comment développer un tableau de JSON de tuples en plusieurs éléments

{"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} 
     ]} 

et ont besoin d'extraire les éléments atb dans les prix et les montants ainsi que l'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] 
}] 

Jusqu'à présent, j'ai ce filtre qui me procure un peu de chemin mais pas tout à fait.
1. Donne une combinaison de tous les prix/montants/identifiants.

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

2. L'élément id reste en dehors de la matrice.

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

Toute aide grandement appréciée.

EDIT Finalement, j'ai modifié une des réponses un peu parce que ma chaîne JSON était plus complexe que la première pensée, dans certains cas, il y a TRD éléments à traiter.

{"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} 
     ]} 

La solution,

(. | 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

Quoi de neuf avec le tag Python? –

+0

Désolé, j'aurais dû préciser que j'utilise jq via pyjq. Je crois que cela fonctionne comme une interface à jq. La syntaxe et les arguments sont les mêmes. – user1191273

Répondre

1

Une solution simple et succincte:

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

Simple et élégant. Merci. – user1191273

0

jq solution:

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 

La sortie:

[ 
    { 
    "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 
    ] 
    } 
]