如何使用JQ从JSON过滤密钥?

时间:2017-01-24 02:49:30

标签: json filter key jq

我有一个巨大的JSON对象,我希望将其过滤掉,只占可用字段的一小部分。我搜索了一些类似的问题,例如enter link description here,但这是针对一组对象的。我有一个类似于:

的JSON对象
{
"timestamp":1455408955250999808,
"client":  
    {
    "ip":"76.72.172.208",
    "srcPort":0,
    "country":"us",
    "deviceType":"desktop"},
"clientRequest":
    {
    "bytes":410,
    "bodyBytes":0}
  }

我要做的是创建一个看起来像的新JSON对象:

{
"timestamp":1455408955250999808,
"client":  
    {
    "ip":"76.72.172.208",
     }
"clientRequest":
    {
    "bytes":410
    }
}

有效地过滤数据。我试过了: | jq 'map({client.ip: .client.ip, timestamp: .timestamp})'我继续得到:

jq: error (at <stdin>:0): Cannot index number with string "client"

即使是最简单的| jq 'map({timestamp: .timestamp})'也会显示相同的错误。

我以为我可以访问K,V对,并使用地图函数,就像上面链接的问题中他的数组一样。任何帮助非常感谢。

2 个答案:

答案 0 :(得分:1)

好哇。真的很简单:)

cat LogSample.txt | jq  '. | {Id: .Id, client: {ip: .client.ip}}'

基本上自己定义对象:)

答案 1 :(得分:1)

如果构造所需的对象,它看起来最简单。根据您的示例,您可以使用以下过滤器执行此操作:

{ timestamp,
  client: { ip: .client.ip },
  clientRequest: {bytes: .clientRequest.bytes }
}

相比之下,map期望其输入为数组,而输入为JSON对象。

另请注意,jq还提供了删除密钥的直接方法,例如:使用del/1