2017-08-13 168 views
0

这里是我的JSON文件JQ嵌套对象

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

和我的输出必须是:

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

我试图通过JQ实现它,但是空事件值使它非常复杂并且无法达到上述输出。这可以使用jq完成吗? 这里是我的代码:

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

显示您尝试过并没有工作的内容将会有所帮助。 – BogdanC

+0

就我个人而言,我发现jq对于超级简单查询来说非常棒。任何更复杂的东西,我只是用lodash创建一个小的JavaScript文件来做操作。我不喜欢生活在足以应付所有问题的外壳中。 – aaaaaa

回答

1

的要求是不是在几个方面很清楚,但大概就是下面的接近你的想法是什么。然而,输出是有效的JSON。

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

随着你的输入,这将产生:

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

您可能希望获得感兴趣的子串在一些其他的方式,如:

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

或:

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

谢谢,它帮助。 – Ria