2015-02-11 146 views
4

我已经能够得到这个。如何使用jq过滤json对象的数组?

JSON输入, 'data.json':

[ 
    { 
    "Selected": null, 
    "Family Name": "Jones", 
    "Couple Name": "Jones, Adam & Rachael Margaret", 
    "Family Phone": "404-4477", 
    "Family Email": "[email protected]", 
    "Family Address": "777 Aggies Court Kindly, California 95388 ", 
    "Head Of House Name": "Jones, Adam", 
    "Head Of House Phone": "(583) 404-2488", 
    "Head Of House Email": "[email protected]", 
    "Spouse Name": "Jones, Rachael Margaret", 
    "Spouse Phone": null, 
    "Spouse Email": null, 
    "Child Name": null, 
    "Child Phone": null, 
    "Child Email": null 
    }, 
    { 
    "Selected": "x", 
    "Family Name": "Xiong", 
    "Couple Name": "Xiong, Arlene Frances", 
    "Family Phone": null, 
    "Family Email": null, 
    "Family Address": "888 Walnut Ave. Blatant, California 95388 ", 
    "Head Of House Name": "Xiong, Arlene Frances", 
    "Head Of House Phone": "583-500-7917", 
    "Head Of House Email": "[email protected]", 
    "Spouse Name": null, 
    "Spouse Phone": null, 
    "Spouse Email": null, 
    "Child Name": null, 
    "Child Phone": null, 
    "Child Email": null 
    }, 
    { 
    "Selected": "x", 
    "Family Name": "Blair", 
    "Couple Name": "Blair, Toby & Silvia", 
    "Family Phone": "358-4645", 
    "Family Email": null, 
    "Family Address": "333 Cindy St. Stoic, California 95388 ", 
    "Head Of House Name": "Blair, Toby", 
    "Head Of House Phone": null, 
    "Head Of House Email": "[email protected]", 
    "Spouse Name": "Blair, Silvia", 
    "Spouse Phone": null, 
    "Spouse Email": null, 
    "Child Name": null, 
    "Child Phone": null, 
    "Child Email": null 
    } 
] 

我可以使用该过滤:

cat data.json | jq '.[] | select(.Selected != null) | {"Head Of House Name", "Head Of House Phone", "Head Of House Email", "Family Phone", "Family Email"}' 

结果:

{ 
    "Head Of House Name": "Xiong, Arlene Frances", 
    "Head Of House Phone": "583-500-7917", 
    "Head Of House Email": "[email protected]", 
    "Family Phone": null, 
    "Family Email": null 
} 
{ 
    "Head Of House Name": "Blair, Toby", 
    "Head Of House Phone": null, 
    "Head Of House Email": "[email protected]", 
    "Family Phone": "358-4645", 
    "Family Email": null 
} 

通知没有阵列括号在对象数组周围,对象之间没有逗号......表示结果不是数组。

问题是,结果不是一个对象数组(坦白说,我不知道它是什么)。我如何从一个json对象数组开始,过滤它们并最终得到一个过滤的对象列表?

回答

10

当您使用过滤器.[]时,实际上是将数组结果分解为每个项目的单独结果。你最终看到的是每个单独的结果,一个接一个。

,以确保它们保存为一个数组,你可以把结果返回到一个数组用方括号包裹你的过滤器:

[ 
    .[] | 
    select(.Selected != null) | 
    { 
     "Head Of House Name", 
     "Head Of House Phone", 
     "Head Of House Email", 
     "Family Phone", 
     "Family Email" 
    } 
] 

或使用map()过滤器把它作为一个数组,你然后可以删除.[]部分:

map(
    select(.Selected != null) | 
    { 
     "Head Of House Name", 
     "Head Of House Phone", 
     "Head Of House Email", 
     "Family Phone", 
     "Family Email" 
    } 
) 

如果你问我,你应该坚持map()