2017-08-13 3 views
0

Voici mon fichier JSONJQ avec des objets imbriqués

{ 
"variables": [], 
"item":[ 
{ 
    "name": "Joe", 
    "item": [ 
    { 
     "name1": "item1", 
     "request": {}, 
     "response": [] 
    }, 
    { 
     "name1": "item2", 
     "request": {}, 
     "response": [] 
    } 
    ] 
}, 
{ 
    "name": "Jim", 
    "item": [ 
    { 
     "name1": "item3", 
     "event": [ 
     { 
      "listen": "test", 
      "script": { 
      "type": "text/javascript", 
      "exec": [ 
       "//code=gst-70" 
      ] 
      } 
     } 
     ], 
     "request": {}, 
     "response": [] 
    }, 
    { 
     "name1": "item4", 
     "event": [ 
     { 
      "listen": "test", 
      "script": { 
      "type": "text/javascript", 
      "exec": [ 
       "//code=gst-50" 
      ] 
      } 
     } 
     ],  
     "request": {}, 
     "response": [] 
    } 
    ] 
} 
] 
} 

et ma sortie doit être:

[{"name":"Joe _ item1","code": }] 
[{"name":"Joe _ item2","code": }] 
[{"name":"Jim _ item3","code":gst-70}] 
[{"name":"Jim _ item4","code":gst-50}] 

Je suis en train de réaliser par JQ, mais les valeurs d'événement nulles, il est très complexe et incapable d'atteindre la sortie comme ci-dessus. Cela peut-il être fait en utilisant jq? Voici mon code:

.item[] 
| ("[{\"name\":\"" + .name + " _ " + .item[].name1+",\"code\":") , 
    (.item[]?.event[]?.script.exec[0] + "}]") 
+0

Montrer ce que vous avez essayé de faire et ce qui ne fonctionne pas vous sera utile. – BogdanC

+0

Personnellement, j'ai trouvé que jq était parfait pour les requêtes super simples. Quelque chose de plus complexe et je viens de créer un petit fichier javascript avec lodash pour faire la manipulation. Je n'aime pas vivre dans la coquille assez pour faire face à tous ses pièges. – aaaaaa

Répondre

1

Les exigences ne sont pas très claires à plusieurs égards, mais ce qui suit est probablement proche de ce que vous avez à l'esprit. La sortie, cependant, est JSON valide.

.item[] 
| .name as $name 
| .item[] 
| {name: "\($name) _ \(.name1)", 
    code: (if .event then .event[].script.exec[0]|split("=")[1] 
      else null end) } 

Avec votre entrée, ce produit:

{"name":"Joe _ item1","code":null} 
{"name":"Joe _ item2","code":null} 
{"name":"Jim _ item3","code":"gst-70"} 
{"name":"Jim _ item4","code":"gst-50"} 

Vous pouvez obtenir le sous-chaîne d'intérêt d'une autre manière, par exemple:

.[1+index("="):] 

ou:

sub("^[^=]*="; "") 
+0

Merci, ça m'a aidé. – Ria