How to convert a string to an integer in a JSON file using jq?
Asked Answered
A

3

64

I use jq to transform a complex json object into a tinier one. My query is:

jq 'to_entries[]| {companyId: (.key), companyTitle: (.value.title), companyCode: (.value.booking_service_code)}' companies.json

Now, the (.key) is parsed as a string, yet I want companyId to be a number.

My result currently looks like this:

{
  "companyId": "1337",
  "companyTitle": "Some company title",
  "companyCode": "oxo"
}

yet it should be like:

{
  "companyId": 1337,
  "companyTitle": "Some company title",
  "companyCode": "oxo"
}
Anticlockwise answered 20/2, 2018 at 14:38 Comment(0)
A
83

jq has inbuilt functions, you can pipe your key to tonumber:

jq 'to_entries[]| {companyId: (.key)|tonumber, companyTitle: (.value.title), companyCode: (.value.booking_service_code)}' companies.json

As per the docs:

tonumber The tonumber function parses its input as a number. It will convert correctly-formatted strings to their numeric equivalent, leave numbers alone, and give an error on all other input.

Example jq '.[] | tonumber' Input [1, "1"] Output 1 1

Anticlockwise answered 20/2, 2018 at 14:38 Comment(2)
Anyway to do this while somehow handling null values?Litigable
@Litigable Please open a new question with that requirement. You can link this answer there.Anticlockwise
T
8

I was trying to turn my string (that converts to a float) to an integer. I was looking for a 'toint' function, one doesn't exist.

jq --arg str "1.435" -n '$str|tonumber'
1.435

I threw a floor in there to make sure the number that was created was an integer:

jq --arg str "1.435" -n '$str|tonumber|floor'
1

This also properly converts the OP original data as well. If you want to guarantee your result is an integer you will need to floor it.

Trinitrophenol answered 25/9, 2020 at 14:41 Comment(1)
Or perhaps round.Heeheebiejeebies
R
0

Warning: using tonumber WILL remove any prefixed zeros like: "data":{"order_number":"024058275" => 24058275

use sed ( or awk ) to remove the ' " '

echo $result | jq '.data.order_number' | sed 's|["]||g'

This will return 024058275

Rightist answered 11/5 at 9:57 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.