2017-01-03 80 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