转换“真"(JSON) 到 Python 等效的“真"
问题描述
我最近使用的 Train status API 在 JSON 对象中添加了两个额外的键值对 (has_arrived, has_departed)
,导致我的脚本崩溃.
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.
这是字典:
{
"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
如果我没记错的话,我认为这是因为 JSON 响应中的布尔值是 false
/true
而 Python 识别 False
/真
.有什么办法解决吗?
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:我尝试将 has_arrived
的 JSON 响应转换为字符串,然后将其转换回布尔值,结果发现我总是会得到一个 True
值,如果字符串中有任何字符.我有点卡在这里.
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 的对象声明语法与 Json 语法非常相似,但它们却截然不同且不兼容.除了 True
/true
问题之外,还有其他问题(例如,Json 和 Python 处理日期的方式非常不同,python 允许单引号和注释,而 Json 不允许).
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 的原生 json 库可用于解析(读取)字符串中的 Json 并将其转换为 python 对象,并且您已经安装了它...
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, ...}'
info = json.loads(data_from_api)
# info is now a python dictionary (or list as appropriate) representing your Json
您也可以将 python 对象转换为 json...
You can convert python objects to json too...
info_as_json = json.dumps(info)
例子:
# 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
> }
相关文章