Converteren van “true” (JSON) naar Python-equivalent “True”

De Train status API die ik gebruik heeft onlangs twee extra sleutelwaardeparen (has_arrived, has_departed)toegevoegd aan het JSON-object, waardoor mijn script crashte.

Hier is het woordenboek:

{
"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
    }
  ]
}

Het is niet verrassend dat ik de volgende foutmelding kreeg:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'false' is not defined

Als ik me niet vergis, denk ik dat dit komt omdat de booleaanse waarde in het JSON-antwoord False/trueis, terwijl Python Falseherkent /true.
Is er een manier om het te omzeilen?

PS: Ik heb geprobeerd het JSON-antwoord van has_arrivedte converteren naar string en het vervolgens terug te converteren naar een booleaanse waarde, om erachter te komen dat ik altijd een truewaarde als er een teken in de tekenreeks zit.
Ik zit hier een beetje vast.


Antwoord 1, autoriteit 100%

Hoewel de objectdeclaratiesyntaxis van Python erg lijkt op de Json-syntaxis, zijn ze verschillend en incompatibel. Naast het probleem true/truezijn er nog andere problemen (bijv. Json en Python gaan heel anders om met datums, en Python staat enkele aanhalingstekens en opmerkingen toe, terwijl Json dat niet doet).

In plaats van te proberen ze als hetzelfde te behandelen, is de oplossing om de ene naar de andere te converteren als dat nodig is.

Python’s native json-bibliotheek kan worden gebruikt om de Json in een string en zet het om in een python-object, en je hebt het al geïnstalleerd…

# Import the library
import json
# Define a string of json data
data_from_api = '{"response_code": 200, ...}'
info = json.loads(data_from_api)
# info is now a python dictionary (or list as appropriate) representing your Json

Je kunt python-objecten ook naar json converteren…

info_as_json = json.dumps(info)

Voorbeeld:

# 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)

En een tweede voorbeeld dat laat zien hoe de True/True-conversie plaatsvindt. Let ook op de wijzigingen in het citaat en hoe de opmerking wordt verwijderd…

info = {'foo': True,  # Some insightful comment here
        'bar': 'Some string'}
# Print a condensed representation of the object
print(json.dumps(info))
> {"bar": "Some string", "foo": true}
# 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
> }

Antwoord 2, autoriteit 11%

Je kunt ook een cast naar boolean doen met de waarde. Bijvoorbeeld, ervan uitgaande dat uw gegevens “json_data” heten:

value = json_data.get('route')[0].get('has_arrived') # this will pull "false" into *value
boolean_value = bool(value == 'true') # resulting in False being loaded into *boolean_value

Het is een beetje hackey, maar het werkt.


Antwoord 3, autoriteit 6%

Gebruik in plaats van evalvoor het antwoord de json-module.


Antwoord 4, autoriteit 3%

Het is mogelijk om de booleaanse waarde van Python te gebruiken voor int, str, list etc.

Bijvoorbeeld:

bool(1)     # True
bool(0)     # False
bool("a")   # True
bool("")    # False
bool([1])   # True
bool([])    # False

In Json-bestand kunt u instellen

"has_arrived": 0,

Vervolgens in je Python-code

if data["has_arrived"]:
    arrived()
else:
    not_arrived()

Het probleem hier is om 0 aangegeven voor False en 0 voor zijn waarde niet te verwarren.


Antwoord 5, autoriteit 2%

"""
String to Dict (Json): json.loads(jstr)
Note: in String , shown true, in Dict shown True
Dict(Json) to String: json.dumps(jobj) 
"""    
>>> jobj = {'test': True}
>>> jstr = json.dumps(jobj)
>>> jobj
{'test': True}
>>> jstr
'{"test": true}'
>>> json.loads(jstr)
{'test': True}

Antwoord 6

Ik zou nog iets willen toevoegen dat zou werken voor mensen die uit een bestand lezen.

with open('/Users/mohammed/Desktop/working_create_order.json')as jsonfile:
            data = json.dumps(jsonfile.read())

Volg dan het bovenstaande geaccepteerdeantwoord, d.w.z.

data_json = json.loads(data)

Antwoord 7

{ “value”: False } of { “key”: false } is geen geldige json
https://jsonlint.com/


Antwoord 8

json.loads kan het booleaanse type van pythons niet ontleden (False, True). Json wil kleine letters false, true

mijn oplossing:

python_json_string.replace(“: True,””, “: true,”).replace(“: False,” “: false,”)

Other episodes