Louis Louis - 15 days ago 5
JSON Question

How to map an object to arrays so it can be coverted to csv?

I'm trying to convert an object that looks like this:

{
"123" : "abc",
"231" : "dbh",
"452" : "xyz"
}


To csv that looks like this:

"123","abc"
"231","dbh"
"452","xyz"


I would prefer to use the command line tool jq but can't seem to figure out how to do the assignment. I managed to get the keys with
jq '. | keys' test.json
but couldn't figure out what to do next.

The problem is you can't convert a k:v object like this straight into csv with
@csv
. It needs to be an array so we need to convert to an array first. If the keys were named, it would be simple but they're dynamic so its not so easy.

Answer

Try this filter:

to_entries[] | [.key, .value]
  • to_entries converts an object to an array of key/value objects. [] breaks up the array to each of the items in the array
  • then for each of the items, covert to an array containing the key and value.

This produces the following output:

[
  "123",
  "abc"
],
[
  "231",
  "dbh"
],
[
  "452",
  "xyz"
]

Then you can use the @csv filter to convert the rows to CSV rows.

$ echo '{"123":"abc","231":"dbh","452":"xyz"}' | jq -r 'to_entries[] | [.key, .value] | @csv'
"123","abc"
"231","dbh"
"452","xyz"