web-dev-qa-db-ja.com

「true」(JSON)をPython同等の「True」に変換する

最近使用した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値を取得することがわかりました。 。私はここでちょっと立ち往生しています。

24
Jarwin

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
}
28
Basic

答えに対してevalを行う代わりに、 json モジュールを使用します。

4
memoselyk