web-dev-qa-db-fra.com

Conversion de "true" (JSON) en Python équivalent "True"

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.

24
Jarwin

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

Au lieu de faire eval sur la réponse, utilisez le module json .

4
memoselyk