简体   繁体   中英

Parsing JSON String without separator using jq

I have a JSON string without the separator , . How do I parse it using jq ?

$echo '{"access_token":"XXXX""expires_in":300"token_type":"Bearer"}' | jq -r .access_token

The above line gives me the below error:

parse error: Expected separator between values at line 1

I understand that the issue is because the JSON string provided is not comma-separated. But this is what I am getting as a response from the server. How do I parse such a string? I want to retrive the value for key "access_token" .

You can use a regular expression with sed if you know the accesss token never contains quotes.

echo '{"access_token":"XXXX""expires_in":300"token_type":"Bearer"}' |
    sed 's/"access_token":"\([^"]*\)/\1/'

The capture group between \\( and \\) captures the string between the quotes, and \\1 in the replacement string extracts it.

Here are two just-jq solutions, each with its own degree of brittleness. The first one attempts to convert each entire input line into valid JSON:

Using fromjson

echo '{"access_token":"XXXX""expires_in":300"token_type":"Bearer"}' |
jq -rR 'gsub("(?<k>\"[^\"]*\")"; "," + .k )
    | gsub("{,\"";"{\"") | gsub(":,\""; ":\"") 
    | fromjson | .access_token'
XXXX

Assume the value is a string on the same line

jq -rR 'sub(".*\"access_token\" *: *\"(?<v>[^\"]*)\".*"; .v )'

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM