Converting “true” (JSON) to Python equivalent “True”

后端 未结 7 1842
感动是毒
感动是毒 2020-12-23 21:21

The Train status API I use recently added two additional key value pairs (has_arrived, has_departed) in the JSON object, which caused my script to crash.

<
相关标签:
7条回答
  • 2020-12-23 21:46

    { "value": False } or { "key": false } is not a valid json https://jsonlint.com/

    0 讨论(0)
  • 2020-12-23 21:48

    It is possible to utilize Python's boolean value for int, str, list etc.

    For example:

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

    In Json file, you can set

    "has_arrived": 0,
    

    Then in your Python code

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

    The issue here is not to confuse 0 indicated for False and 0 for its value.

    0 讨论(0)
  • 2020-12-23 21:48

    json.loads cant parse the pythons boolean type (False, True). Json wants to have small letters false, true

    my solution:

    python_json_string.replace(": True,", ": true,").replace(": False,", ": false,")

    0 讨论(0)
  • 2020-12-23 21:54

    Even though Python's object declaration syntax is very similar to Json syntax, they're distinct and incompatible. As well as the True/true issue, there are other problems (eg Json and Python handle dates very differently, and python allows single quotes and comments while Json does not).

    Instead of trying to treat them as the same thing, the solution is to convert from one to the other as needed.

    Python's json library can be used to parse (read) the Json in a string and convert it into a python object...

    data_from_api = '{"response_code": 200, ...}'  # 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
    

    You can convert python objects to json too...

    info_as_json = json.dumps(info)
    

    Example:

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

    And a second example showing how the True/true conversion happens. Note also the changes to quotation, and how the comment is stripped...

    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
    > }
    
    0 讨论(0)
  • 2020-12-23 21:54

    You can also do a cast to boolean with the value. For example, assuming that your data is called "json_data":

    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
    

    It's kind of hackey, but it works.

    0 讨论(0)
  • 2020-12-23 22:04

    Instead of doing eval on the answer, use the json module.

    0 讨论(0)
提交回复
热议问题