Reputation: 2822
I'm trying to get jq
to parse a JSON structure like:
{
"a" : 1,
"b" : 2,
"c" : "{\"id\":\"9ee ...\",\"parent\":\"abc...\"}\n"
}
That is, an element in the JSON is a string with escaped json.
So, I have something along the lines of
$ jq [.c] myFile.json | jq [.id]
But that crashes with jq: error: Cannot index string with string
This is because the output of .c is a string, not more JSON. How do I get jq to parse this string?
My initial solution is to use sed to replace all the escape chars (\":\"
, \",\"
and \"
) but that's messy, I assume there's a way built into jq
to do this?
Thanks!
edit: Also, the jq version available here is:
$ jq --version
jq version 1.3
I guess I could update it if required.
Upvotes: 206
Views: 112418
Reputation: 14517
Motivation: you want to parse JSON string - you want to escape a JSON object that's wrapped with quotes and represented as a String buffer, and convert it to a valid JSON object. For example:
some JSON unescaped string :
"{\"name\":\"John Doe\",\"position\":\"developer\"}"
the expected result ( a JSON object ):
{"name":"John Doe","position":"developer"}
Solution: In order to escape a JSON string and convert it into a valid JSON object use the sed
tool in command line and use regex expressions to remove/replace specific characters:
cat current_json.txt | sed -e 's/\\\"/\"/g' -e 's/^.//g' -e 's/.$//g'
s/\\\"/\"/g
replacing all backslashes and quotes ( \"
) into quotes only ("
)
s/^.//g
replacing the first character in the stream to none character
s/.$//g
replacing the last character in the stream to none character
Upvotes: 3
Reputation: 89584
You can use the raw output (-r) that will unescape characters:
jq -r .c myfile.json | jq .id
ADDENDUM: This has the advantage that it works in jq 1.3 and up; indeed, it should work in every version of jq that has the -r option.
Upvotes: 88