2015-09-20 26 views
0

对于像这样的输入文件值:,我怎么能限制基于一个关键

{ 
    "employees": [ 
    { 
     "number": "101", 
     "tags": [ 
     { 
      "value": "yes", 
      "key": "management" 
     }, 
     { 
      "value": "joe", 
      "key": "login" 
     }, 
     { 
      "value": "joe blogs", 
      "key": "name" 
     } 
     ] 
    }, 
    { 
     "number": "102", 
     "tags": [ 
     { 
      "value": "no", 
      "key": "management" 
     }, 
     { 
      "value": "jane", 
      "key": "login" 
     }, 
     { 
      "value": "jane doe", 
      "key": "name" 
     } 
     ] 
    }, 
    { 
     "number": "103", 
     "tags": [ 
     { 
      "value": "no", 
      "key": "management" 
     }, 
     { 
      "value": "john", 
      "key": "login" 
     }, 
     { 
      "value": "john doe", 
      "key": "name" 
     } 
     ] 
    } 
    ] 
} 

...我想获得的所有非管理员工的细节,使所需的输出看起来是这样的:

{ 
    "number": "102", 
    "name": "jane doe", 
    "login": "jane" 
} 
{ 
    "number": "103", 
    "name": "john doe", 
    "login": "john" 
} 

我无法弄清楚如何限制基于一个重要成果,而不选择那个键(在这种情况下,“管理办法”)

回答

2

下面是一个略微更简洁的解决方案:

.employees[] 
| .tags |= from_entries 
| select(.tags.management == "no") 
| {number, "name": .tags.name, "login": .tags.login} 
+0

由于另一种解决方案。更简洁的胜利:) – phatypus

0

使用from_entries,这个工作对我来说:

$ jq '.employees[] | {number: .number, tags: .tags | from_entries} | select(.tags.management=="no") | {number: .number, name: .tags.name, login: .tags.login}' input 

...和输出是:

{ 
    "number": "102", 
    "name": "jane blogs", 
    "login": "jane" 
} 
{ 
    "number": "103", 
    "name": "john doe", 
    "login": "john" 
} 

有可能是一个更好的方式来实现我想要的东西,所以如果有人要提供我会离开的问题开一会儿更好的解决方案。

0

这里是使用from_entries

.employees[] 
| {number} + (.tags | from_entries) 
| if .management == "no" then {number, name, login} else empty end 
相关问题