phear
phear

Reputation: 55

How to create key:value list from JSON? Key name should contain some values from object itself

I'm trying to parse JSON and store certain values as metrics in Graphite. In order to make my Graphite more user-friendly I have to form a metric name, that contains some values from its object. I got working solution on bash loops + jq, but it's really slow. So I'm asking for help :)

Here is my input:

{
...
  },
  "Johnny Cage": {
    "firstname": "Johnny",
    "lastname": "Cage",
    "height": 183,
    "weight": 82,
    "hands": 2,
    "legs": 2,
    ...
  },
  ...
}

Desired output:

mk.fighter.Johnny.Cage.firstname Johnny
mk.fighter.Johnny.Cage.lastname Cage
mk.fighter.Johnny.Cage.height 183
mk.fighter.Johnny.Cage.weight 82
mk.fighter.Johnny.Cage.hands 2
mk.fighter.Johnny.Cage.legs 2
...

Upvotes: 2

Views: 229

Answers (1)

RomanPerekhrest
RomanPerekhrest

Reputation: 92854

With single jq command:

Sample input.json:

{
  "Johnny Cage": {
    "firstname": "Johnny",
    "lastname": "Cage",
    "height": 183,
    "weight": 82,
    "hands": 2,
    "legs": 2
  }
}

jq -r 'to_entries[] | (.key | sub(" "; ".")) as $name 
       | .value | to_entries[]
       | "mk.fighter.\($name).\(.key) \(.value)"' input.json

To get $name as a combination of inner firstname and lastname keys replace
(.key | sub(" "; ".")) as $name with "\(.value.firstname).\(.value.lastname)" as $name


The output:

mk.fighter.Johnny.Cage.firstname Johnny
mk.fighter.Johnny.Cage.lastname Cage
mk.fighter.Johnny.Cage.height 183
mk.fighter.Johnny.Cage.weight 82
mk.fighter.Johnny.Cage.hands 2
mk.fighter.Johnny.Cage.legs 2

Upvotes: 2

Related Questions