Подтвердить что ты не робот

Преобразование "истинного" (JSON) в эквивалент Python "True"

API статуса поезда, который я использую, недавно добавил две дополнительные пары значений ключа (has_arrived, has_departed) в объекте JSON, что вызвало сбой моего script.

Здесь словарь:

{
"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: Я попытался преобразовать ответ JSON has_arrived в строку и затем преобразовать его обратно в логическое значение, только чтобы узнать, что я всегда получаю значение true, если в строке есть какой-либо символ. Я немного застрял здесь.

4b9b3361

Ответ 1

Хотя синтаксис объявления объекта Python очень похож на синтаксис Json, они различны и несовместимы. Помимо проблемы True/true, существуют и другие проблемы (например, Json и Python обрабатывают даты совершенно по-разному, а python разрешает комментарии, а Json - нет).

Вместо того, чтобы пытаться рассматривать их как одно и то же, решение состоит в том, чтобы преобразовать один в другой по мере необходимости.

Библиотека json Python может использоваться для анализа (чтения) 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. Обратите внимание также на изменения цитаты и то, как комментарий удаляется...

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
}

Ответ 2

Вместо ответа eval в ответ используйте модуль json.