最近使用したTrain status APIは、JSONオブジェクトに2つのキーと値のペア(has_arrived, has_departed)
を追加したため、スクリプトがクラッシュしました。
辞書は次のとおりです。
{
"response_code": 200,
"train_number": "12229",
"position": "at Source",
"route": [
{
"no": 1,
"has_arrived": false,
"has_departed": false,
"scharr": "Source",
"scharr_date": "15 Nov 2015",
"actarr_date": "15 Nov 2015",
"station": "LKO",
"actdep": "22:15",
"schdep": "22:15",
"actarr": "00:00",
"distance": "0",
"day": 0
},
{
"actdep": "23:40",
"scharr": "23:38",
"schdep": "23:40",
"actarr": "23:38",
"no": 2,
"has_departed": false,
"scharr_date": "15 Nov 2015",
"has_arrived": false,
"station": "HRI",
"distance": "101",
"actarr_date": "15 Nov 2015",
"day": 0
}
]
}
当然のことながら、次のエラーが表示されました。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'false' is not defined
間違っていない場合、これはJSON応答のブール値がfalse
/true
であるのに対し、PythonはFalse
/True
。それを回避する方法はありますか?
PS:has_arrived
のJSONレスポンスを文字列に変換してからブール値に変換しようとしましたが、文字列に文字がある場合は常にTrue
値を取得することがわかりました。 。私はここでちょっと立ち往生しています。
Pythonのオブジェクト宣言構文はJson構文に非常に似ていますが、それらは明確で互換性がありません。 True
/true
の問題だけでなく、他の問題もあります(たとえば、JsonとPython日付の処理方法が非常に異なり、pythonはコメントを許可しますが、Jsonは許可しません。
それらを同じものとして扱うのではなく、解決策は必要に応じて一方から他方に変換することです。
Pythonの json ライブラリを使用して、文字列内のJsonを解析(読み取り)し、pythonオブジェクトに変換できます...
data_from_api = '{...}' # data_from_api should be a string containing your json
info = json.loads(data_from_api)
# info is now a python dictionary (or list as appropriate) representing your Json
pythonオブジェクトもjsonに変換できます...
info_as_json = json.dumps(info)
例:
# Import the json library
import json
# Get the Json data from the question into a variable...
data_from_api = """{
"response_code": 200,
"train_number": "12229",
"position": "at Source",
"route": [
{
"no": 1, "has_arrived": false, "has_departed": false,
"scharr": "Source",
"scharr_date": "15 Nov 2015", "actarr_date": "15 Nov 2015",
"station": "LKO", "actdep": "22:15", "schdep": "22:15",
"actarr": "00:00", "distance": "0", "day": 0
},
{
"actdep": "23:40", "scharr": "23:38", "schdep": "23:40",
"actarr": "23:38", "no": 2, "has_departed": false,
"scharr_date": "15 Nov 2015", "has_arrived": false,
"station": "HRI", "distance": "101",
"actarr_date": "15 Nov 2015", "day": 0
}
]
}"""
# Convert that data into a python object...
info = json.loads(data_from_api)
print(info)
そして、True/True変換がどのように行われるかを示す2番目の例。引用への変更、およびコメントの削除方法にも注意してください...
info = {'foo': True, # Some insightful comment here
'bar': 'Some string'}
# Print a condensed representation of the object
print(json.dumps(info))
# Or print a formatted version which is more human readable but uses more bytes
print(json.dumps(info, indent=2))
出力:
{"bar": "Some string", "foo": true}
{
"bar": "Some string",
"foo": true
}
答えに対してeval
を行う代わりに、 json
モジュールを使用します。