2017-01-24 40 views
2

我有一個巨大的JSON對象,我想將它過濾掉,只佔可用字段的一小部分。我搜索了一些類似的問題,例如enter link description here,但這是針對一組對象。我有一個JSON對象,看起來像:如何使用JQ過濾來自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對,並使用地圖函數作爲人爲他的數組在上面鏈接的問題。任何幫助非常感謝。

回答

1

Huzzah。夠簡單真的:)

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

基本上自己定義對象:)

+3

它比這更簡單:不需要最初的'.',在這裏可以將「Id:.Id」縮寫爲「Id」。所以:'jq'{Id,client:{ip:.client.ip}}'就足夠了。 – peak

1

看起來這將是最簡單的,如果你建立你想要的對象。根據你的榜樣,你可以這樣做使用以下過濾器:

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

相比之下,map預計其輸入是一個數組,而你的投入是一個JSON對象。

另請注意,jq還提供直接刪除密鑰的方法,例如,使用del/1

+0

感謝@peak,作爲後續問題,如果且僅當條目存在於我正在觀察的json中時,如何創建該對象。即傳入的JSON對.client.ip沒有任何價值,我寧願不創建該字段,如果它不存在。此方法將強制創建並清空.client.ip字段。 – HectorOfTroy407