使用Python从BASH CURL Response获取JSON值

Aut*_*mic 3 python json curl

我在BASH中解析对2个变量的JSON响应时遇到问题.我没有权限安装jq或jsawk或任何酷,让生活更轻松.我有python,就是这样.

这就是我正在使用的:我有一个获得JSON响应的curl调用.响应存储在名为api_response的变量中.

API_RESPONSE=$(curl --silent -v -H "Content-Type: application/json" -H "MY-Token: $Token" -XPOST -d "$INPUTS" ${MY_BASE}$MY_PROCESS${PROCESS})
Run Code Online (Sandbox Code Playgroud)

这个变量基本上是来自api的响应的值

[{"name":"test-name1", "value" : "test-value1"},{"name" : "test-name2","value" : "test-value2"}]
Run Code Online (Sandbox Code Playgroud)

在过去,我只需要从响应中获取单个值,并且能够使用以下内容执行此操作

API_RESPONSE=$(curl --silent -v -H "Content-Type: application/json" -H "MY-Token: $Token" -XPOST -d "$INPUTS" ${MY_BASE}$MY_PROCESS${PROCESS} | python -c "import sys, json; print json.load(sys.stdin)[1]['value'])
Run Code Online (Sandbox Code Playgroud)

[输出]

test-value2
Run Code Online (Sandbox Code Playgroud)

我试图从单个变量API_RESPONSE中提取两个JSON值,但是这样做会出错.

API_RESPONSE=$(curl --silent -v -H "Content-Type: application/json" -H "MY-Token: $Token" -XPOST -d "$INPUTS" ${MY_BASE}$MY_PROCESS${PROCESS})

myvar1=$($API_RESPONSE | python -c "import sys, json; print json.load(sys.stdin)[0]['value']")
myvar2=$($API_RESPONSE | python -c "import sys, json; print json.load(sys.stdin)[1]['value']")
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib64/python2.6/json/__init__.py", line 267, in load 
parse_constant=parse_constant, **kw)
File "/usr/lib64/python2.6/json/__init__.py", line 307, in loads return _default_decoder.decode(s)
File "/usr/lib64/python2.6/json/decoder.py", line 319, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib64/python2.6/json/decoder.py", line 338, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Run Code Online (Sandbox Code Playgroud)

变量api_response与以前工作的数据相同.为什么它会使用curl调用而不是变量?

Aut*_*mic 6

我在朋友的帮助下弄清楚了.

当从bash变量转到python sys.stdin时,需要通过SOME操作将bash变量重定向到python sys.stdin.

使用curl执行管道输出到python sys.stdin它可以工作,因为输出被重定向到python.但是,一旦我将整个响应存储在bash中的变量中,下一步就是回显输出并重定向到python.

[json回应]

[{"name":"test-name1", "value" : "test-value1"},{"name" : "test-name2","value" : "test-value2"}]
Run Code Online (Sandbox Code Playgroud)

[代码块]

API_RESPONSE=$(curl --silent -v -H "Content-Type: application/json" -H "MY-Token: $Token" -XPOST -d "$INPUTS" ${MY_BASE}$MY_PROCESS${PROCESS})

myvar1=$( echo $API_RESPONSE | python -c "import sys, json; print json.load(sys.stdin)[0]['value']")
myvar2=$( echo $API_RESPONSE | python -c "import sys, json; print json.load(sys.stdin)[1]['value']")
echo $myvar1
echo $myvar2
Run Code Online (Sandbox Code Playgroud)

[输出]

test-value1
test-value2
Run Code Online (Sandbox Code Playgroud)