Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invalid numeric literal with jq

Tags:

I have a large amount of JSON from a 3rd party system which I would like to pre-process with jq, but I am having difficulty composing the query, test case follows:

$ cat test.json
{
  "a": "b",
  "c": "d",
  "e": {
         "1": {
            "f": "g",
            "h": "i"
          }
       }
}
$ cat test.json|jq .e.1.f
jq: error: Invalid numeric literal at EOF at line 1, column 3 (while parsing '.1.') at <top-level>, line 1:
.e.1.f

How would I get "g" as my output here? Or how do I cast that 1 to a "1" so it is handled correctly?

like image 581
Gaius Avatar asked Jul 08 '17 11:07

Gaius


2 Answers

From jq manual :

You can also look up fields of an object using syntax like .["foo"] (.foo above is a shorthand version of this, but only for identifier-like strings).

You also need quotes and use -r if you want raw output :

jq -r '.e["1"].f' test.json
like image 184
Bertrand Martel Avatar answered Oct 12 '22 07:10

Bertrand Martel


I wrote a shell script function that calls the curl command, and pipes it into the jq command.

function getName {
  curl http://localhost:123/getname/$1 | jq;
}
export -f getName

When I ran this from the CLI,

getName jarvis

I was getting this response:

parse error: Invalid numeric literal at line 1, column 72

I tried removing the | jq from the curl command, and I got back the result without jq parsing:

<Map><timestamp>1234567890</timestamp><status>404</status><error>Not Found</error><message>....

I first thought that I had a bad character in the curl command, or that I was using the function param $1 wrong.

Then I counted the number of chars in the result string, and I noticed that the 72nd char in that string was the empty space between "Not Found".

The underlying issue was that I didn't have a method named getname yet in my spring REST controller, so the response was coming back 404 Not Found. But in addition, jq wasn't handling the empty space in the response except by outputting the error message.

I'm new to jq so maybe there is a way to get around the empty space issue, but that's for another day.

like image 43
Steve T Avatar answered Oct 12 '22 09:10

Steve T