2017-01-03 12 views
0

BASHの2つの変数に対するJSON応答の解析に問題があります。私はjqやjsawkなどのインストールにアクセスできないので、人生を楽にしてくれます。私はPythonを持っています。BASHからのJSON値の取得Pythonによる応答

これは私がやっていることです:私は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 

私は1つの変数API_RESPONSEから2つの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が以前働いていた同じデータです。変数からではなく、カールコールではなぜ機能しますか?

+0

おかげではなく、人 – Autonomic

+0

イムない年齢について議論する位置に技術の私はちょうどPythonがcurl inlineで動作する理由と、変数ではないことについての洞察を必要とします。 – 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 
関連する問題