L'API d'état du train que j'utilise a récemment ajouté deux paires de valeurs clés supplémentaires (has_arrived, has_departed)
dans l'objet JSON, ce qui a provoqué le plantage de mon script.
Voici le dictionnaire:
{
"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
}
]
}
Sans surprise, j'ai eu l'erreur suivante:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'false' is not defined
Si je ne me trompe pas, je pense que c'est parce que la valeur booléenne dans la réponse JSON est false
/true
alors que Python reconnaît False
/True
. Y a-t-il un moyen de contourner cela?
PS: j'ai essayé de convertir la réponse JSON de has_arrived
en chaîne, puis la reconvertir en valeur booléenne, seulement pour découvrir que j'obtiendrai toujours une valeur True
s'il y a du caractère dans la chaîne. Je suis un peu coincé ici.
Même si la syntaxe de déclaration d'objet de Python est très similaire à la syntaxe Json, elles sont distinctes et incompatibles. Outre le problème True
/true
, il existe d'autres problèmes (par exemple, Json et Python gèrent les dates très différemment, et python autorise les commentaires alors que Json ne le fait pas) .
Au lieu d'essayer de les traiter comme la même chose, la solution est de les convertir de l'un à l'autre selon les besoins.
La bibliothèque Python json peut être utilisée pour analyser (lire) le Json dans une chaîne et le convertir en un objet 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
Vous pouvez également convertir des objets python en json ...
info_as_json = json.dumps(info)
Exemple:
# 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)
Et un deuxième exemple montrant comment la conversion True/true se produit. Notez également les modifications apportées à la citation et la façon dont le commentaire est supprimé ...
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))
Sortie:
{"bar": "Some string", "foo": true}
{
"bar": "Some string",
"foo": true
}
Au lieu de faire eval
sur la réponse, utilisez le module json
.