HectorOfTroy407
HectorOfTroy407

Reputation: 1907

How do I simplify a JSON object using JQ?

I've got a huge JSON object and I want to filter it down, to a small % of the available fields. I've searched some similar questions, such as enter link description here but that is for an array of objects. I have a JSON object that looks something like:

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

What I'm trying to do is create a new JSON object that looks likes:

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

So effectively filter down the data. I've tried: | jq 'map({client.ip: .client.ip, timestamp: .timestamp})' and I continue to get:

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

Even the most simple | jq 'map({timestamp: .timestamp})' is showing the same error.

I thought I could access the K,V pairs and use the map function as the person did for his array in the question linked above. Any help much appreciated.

Upvotes: 2

Views: 2910

Answers (2)

peak
peak

Reputation: 116919

It looks like it will be simplest if you construct the object you want. Based on your example, you could do so using the following filter:

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

By contrast, map expects its input to be an array, whereas your input is a JSON object.

Please also note that jq provides direct ways to remove keys as well, e.g. using del/1.

Upvotes: 1

HectorOfTroy407
HectorOfTroy407

Reputation: 1907

Huzzah. Simple enough really :)

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

Basically define the object yourself :)

Upvotes: 3

Related Questions