2017-01-03 51 views
0

我在解析BASH中的2个变量的JSON响应时出现问题。我没有权限安装jq或jsawk或任何让生活更轻松的酷。我有python,就是这样。从BASH CURL获取JSON值使用Python响应

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

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

这个变量基本上是从API

[{"name":"test-name1", "value" : "test-value1"},{"name" : "test-name2","value" : "test-value2"}] 

在过去的响应的价值,我只需要得到响应单个值,并能够在使用该做的以下

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']) 

[输出]

test-value2 

我试图从单个变量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']") 

我得到以下错误:

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 

变量api_response是在工作之前相同的数据。为什么它会使用curl调用而不是来自变量?

+0

谢谢,没有帮助 – Autonomic

+0

Im不在一个位置,争论年龄的技术。我只需要了解python为什么使用curl内联而不是变量。 – Autonomic

回答

3

我在朋友的帮助下计算出来的。

从bash变量到python sys.stdin时,需要将一个bash变量通过SOME动作重定向到python sys.stdin。

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

[JSON响应]

[{"name":"test-name1", "value" : "test-value1"},{"name" : "test-name2","value" : "test-value2"}] 

[代码块]

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 

[输出]

test-value1 
test-value2