【问题标题】:How do I get field from HTTP GET JSON result to file?如何从 HTTP GET JSON 结果中获取字段到文件?
【发布时间】:2016-07-01 02:02:22
【问题描述】:

我正在尝试向 API 服务发出 HTTP GET 请求,并将 JSON 结果中返回的字段之一推送到 txt 文件。

基于之前提出的这个问题:(Getting JSON value from cURL in Linux Bash) ...我有一个 bash 脚本如下...

TOKEN_FILE="/myhome/project/resources/auto_token.txt"

AUTH_RESULT=$(curl -i -H "Content-Type: application/json" "https://access.mywebservice.com/access/oauth/token?grant_type=client_credentials&client_id=123456&client_secret=MySecretPassword");

RESULT_FIELDS=$( cat <<EOF | json_reformat | \
    sed -rne '/:/s@^\s+"(\w+)":\s+"([^"]+)",?@json_\1="\2"@gp'
[$AUTH_RESULT]
EOF
)

if [ -f "$TOKEN_FILE" ]
then 
    echo "$RESULT_FIELDS" > "$TOKEN_FILE"
fi

预期的 JSON 结果如下所示(从 Postman 复制):

{
  "access_token": "eyJ5bGciOiJSUzI1NiJ6.eyJzY29wZSI6WyJDUl7iLCJNQVAiLCJQVFkiLCJ8R1QiLCJTVFMiLCJUVEwiXSwiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MtdWF0LWFwaS5jb3JlbG9naWMuYXNpYSIsImVudl9hx2Nlc3NfcmVzdHJpY3QiOmZhbHNlLCJleHAiOjE0NjcyODMwODcsImNsaWVudF9pZCI6IjhhOTY4OGJjIn0.F2iQfVsi9zntOxKYrNRukSIwuQ_LGSi_WMIXKII2A3GOEaqs-WmFTi7az9rvvfDsOl9rHy_s_66A6PiCpPftyw21Fl0aZZRoFcKv2H_zDUHuxOEs8V36jHeLghV7pjHwYI_nG68CIGvfuRWFNzQuiMFWc_i8oB3n5noSd8fQqa4",
  "token_type": "bearer",
  "expires_in": 43199,
  "scope": "PROD1 PROD2 PROD3",
  "iss": "https://access.mywebservice.com",
  "env_access_restrict": false
}

我收到以下错误返回...

bash-4.1$ ./token_renewal_test_05.sh
: command not foundt_05.sh: line 2:
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
115   576    0   576    0     0   2266      0 --:--:-- --:--:-- --:--:-- 30315
: command not foundt_05.sh: line 3:
: command not foundt_05.sh: line 4:
./token_renewal_test_05.sh: line 14: warning: here-document at line 10 delimited by end-of-file (wanted `EOF')
./token_renewal_test_05.sh: line 13: warning: here-document at line 9 delimited by end-of-file (wanted `EOF')
: command not foundt_05.sh: line 13:
lexical error: invalid char in json text.
                                       sed -rne '/:/s@^\s+"(\w+)":\s+"
                     (right here) ------^
: command not foundt_05.sh: line 10:
./token_renewal_test_05.sh: line 16: syntax error: unexpected end of file

我对 bash 有点陌生,尽管似乎是直接指向问题的指针,但在解决这个问题时遇到了问题(注意这是第 5 版)!

谁能提供这方面的帮助?

PS:我也没有jq。

谢谢!

问候,

克里斯

【问题讨论】:

  • 你应该得到jq,或者编写一个小的 Python/Perl/任何脚本,使用适当的 JSON 解析器来处理结果。不要使用sed
  • 我无法正确“安装”jq,但现在让它在我的主目录中运行。如果我运行...UPDATE=$(curl -i -H "Content-Type: application/json" "https://access.mywebservice.com/access/oauth/token?grant_type=client_credentials&amp;client_id=123456&amp;client_secret=MySecretPassword"); echo $UPDATE 我得到响应:`Set-Cookie: TS01b4dffd=019ed823624d4ce0a5613954a4e52e4a4e357b9192df4cb403 {"access_token":"eyJhb....MWrD9m2fk","token_type":"bearer","expires_in:" "范围":"PROD1 PROD2 PROD3","iss":"access.mywebservice.com","env_access_restrict":f…} `
  • 当我使用 jq 运行以下命令以尝试解析它时...` AUTH_RESULT=$(curl -i -H "Content-Type: application/json" "access.mywebservice.com/access/oauth/…); ACCESS_TOKEN =$(./jq -r '.access_token'

标签: json bash http


【解决方案1】:

根据this comment Parsing JSON with UNIX tools 的警告购买者。

适合您的格式的有效解决方案:

eval $(cat <<EOF | \
    sed -re 's/(,|\{|\})//g' | \
    sed -re 's/"(\w+)":\s*"?([^"]*)"?$/json_\1='\''\2'\''/'
$JSON
EOF
)
set | grep '^json_'
json_access_token=eyJ5bGciOiJSUzI1NiJ6.eyJzY29wZSI6WyJDUl7iLCJNQVAiLCJQVFkiLCJ8R1QiLCJTVFMiLCJUVEwiXSwiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MtdWF0LWFwaS5jb3JlbG9naWMuYXNpYSIsImVudl9hx2Nlc3NfcmVzdHJpY3QiOmZhbHNlLCJleHAiOjE0NjcyODMwODcsImNsaWVudF9pZCI6IjhhOTY4OGJjIn0.F2iQfVsi9zntOxKYrNRukSIwuQ_LGSi_WMIXKII2A3GOEaqs-WmFTi7az9rvvfDsOl9rHy_s_66A6PiCpPftyw21Fl0aZZRoFcKv2H_zDUHuxOEs8V36jHeLghV7pjHwYI_nG68CIGvfuRWFNzQuiMFWc_i8oB3n5noSd8fQqa4
json_env_access_restrict=false
json_expires_in=43199
json_iss=https://access.mywebservice.com
json_scope='PROD1 PROD2 PROD3'
json_token_type=bearer

【讨论】:

  • 谢谢@DrewBeres 在我的 bash 脚本中使用以下内容...` eval $(cat
  • 这是我试图解析的 JSON 输出,因为它在 bash 中回显时返回...Set-Cookie: TS01b4dffd=019ed82362e63dd7c11ac94b992e5bd506f3bd80494508f1ec5f8dfd {"access_token":"eyJhbGciOiJSUzI1NiJ9.eyJzY29wZSI6WyJDUlQiLCJNQVAiLCJQVFkiLCJTR1QiLCJTVFMiLCJUVEwiXSwiaXNzIjoiaHR0cHM6Ly9hY2Nlc3MtdWF0LWFwaS5jb3JlbG9naYjFzo9M9ukWLFdae1htkc79pdt3o9fJdRU47iGsxPTKz8S5TcJreM6S_4Y3pA3VlYb7HLZKs2WAQLxT7BJ_-2rEvmHqkWWvQi45VlIL7J94wl4jcITw","token_type":"bearer","expires_in":43199,"scope":"PROD1 PROD2 PROD3","iss":"https:access-mywebservice.com","env_access_restrict":false}
【解决方案2】:

再次感谢 Chepner 和 Drew

我在使用 Sed 时遇到了太多问题(可能是因为我缺乏经验)。事实证明,我尝试使用lookbehind。 Sed 没有这个,但 grep 这样做知道我的 JSON 响应的结构永远不会有机会,我能够使用以下 grep 来提取我的令牌...... grep -o -P '(?<="access_token":").*(?=","token_type")'

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 2022-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    相关资源
    最近更新 更多