2017-01-24 3 views
2

У меня огромный объект JSON, и я хочу отфильтровать его до небольшого% доступных полей. Я искал некоторые похожие вопросы, такие как enter link description here, но это для массива объектов. У меня есть объект JSON, который выглядит примерно так:Как фильтровать ключи от JSON с помощью JQ?

{ 
"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

Смежные вопросы