将“ true”(JSON)转换为等效于Python的“ True”

发布于 2021-01-29 15:07:26

我最近使用的Train status API(has_arrived, has_departed)在JSON对象中添加了两个额外的键值对,这导致我的脚本崩溃。

这是字典:

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

毫不奇怪,我得到了以下错误:

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

如果我没记错的话,我认为这是因为JSON响应中的布尔值是false/,true而Python可以识别False/
True。有什么办法解决吗?

PS:我尝试将的JSON响应转换has_arrived为字符串,然后将其转换回布尔值,结果发现True如果字符串中有任何字符,我总会得到一个值。我有点卡在这里。

关注者
0
被浏览
67
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    尽管Python的对象声明语法与Json语法非常相似,但它们是截然不同且不兼容的。除True/true问题外,还有其他问题(例如,Json和Python处理日期的方式非常不同,而python允许单引号和注释,而Json不允许)。

    解决方案不是尝试将它们视为同一事物,而是根据需要将它们从一个转换为另一个。

    Python的json库可用于解析(读取)字符串中的Json并将其转换为python对象…

    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
    

    您也可以将python对象转换为json …

    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)
    

    第二个示例显示True / true转换是如何发生的。还请注意对引号的更改以及如何删除注释…

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看