Parsing nested string json
Today I learned how to parse a nested json with jq
, but the nested json is a string. It's just easier to show an example so here we are:
{
"a": "{\"b\": \"c\"}"
}
This is not a common situation but I found that out today on a codebase and my first thought was to call jq
get the content of the node a
and then pipe it into another jq
command. It would look like this:
echo '{"a": "{\\"b\\": \\"c\\"}"}' | jq '.a' | jq
# => "{\"b\": \"c\"}"
As we can see the result is not a json, but a string so we cannot access inner nodes just yet.
And the solution to this problem is to use the -r
flag on the first jq
call to output the result in a raw format, so the "
surounding double quotes will disappear. And with that in place we can easily parse the nested/nasty json:
echo '{"a": "{\\"b\\": \\"c\\"}"}' | jq -r '.a' | jq
# => {
# => "b": "c"
# => }
Then finally:
echo '{"a": "{\\"b\\": \\"c\\"}"}' | jq -r '.a' | jq '.b'
# => "c"
Tweet