Converting "true" (JSON) to Python equivalent "True"

PythonJsonDictionaryBoolean

Python Problem Overview


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.

Here's the dictionary:

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

Not surprisingly, I got the following error:

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

If I am not mistaken, I think this is because the boolean value in the JSON response is false/true whereas Python recognizes False/True. Is there any way around it?

PS: I tried converting the JSON response of has_arrived to string and then converting it back to a boolean value, only to find out that I'll always get a True value if there's any character in the string. I am kinda stuck here.

Python Solutions


Solution 1 - Python

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 native json library can be used to parse (read) the Json in a string and convert it into a python object, and you already have it installed...

# Import the library
import json
# Define a string of json data
data_from_api = '{"response_code": 200, ...}'
data = 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...
data = json.loads(data_from_api)
print(data)

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

Solution 2 - Python

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.

Solution 3 - Python

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

Solution 4 - Python

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.

Solution 5 - Python

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

Solution 6 - Python

I would like to add one more thing that would work for people who are reading from a file.

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

Then follow the above accepted answer i.e.

data_json = json.loads(data)

Solution 7 - Python

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

Solution 8 - Python

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,")

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJarwinView Question on Stackoverflow
Solution 1 - PythonBasicView Answer on Stackoverflow
Solution 2 - PythoneatsfoodView Answer on Stackoverflow
Solution 3 - PythonmemoselykView Answer on Stackoverflow
Solution 4 - PythonalercelikView Answer on Stackoverflow
Solution 5 - PythonRobina LiView Answer on Stackoverflow
Solution 6 - Pythonmohammed_ayazView Answer on Stackoverflow
Solution 7 - PythonFabián FuentealbaView Answer on Stackoverflow
Solution 8 - PythonWilli SchmidtView Answer on Stackoverflow