转换" true" (JSON)与Python相当的" True"

时间:2015-11-15 17:30:01

标签: python json dictionary boolean

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

这是字典:

{
"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:我尝试将has_arrived的JSON响应转换为字符串,然后将其转换回布尔值,但发现我总是得到True值,如果有& #39;字符串中的任何字符。 我有点被困在这里。

8 个答案:

答案 0 :(得分:26)

尽管Python的对象声明语法与Json语法非常相似,但它们是截然不同且不兼容的。除了files=dir('*.dat'); n_files=length(files) % Define the number of rows in each inout file n_rows=40; % Define the number of colums in each inout file n_col=15; NeededData_2=nan(n_rows*n_files,n_col) % Define the sequence of rows r_list=1:n_rows:n_rows*n_files for i=1:3 Data=dlmread(files(i).name) NeededData_2(r_list(i):r_list(i)+n_rows-1,:)=Data end / True问题,还有其他问题(例如Json和Python处理日期的方式非常不同,python允许注释而Json没有)。

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

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

true

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

data_from_api = '{...}'  # 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

示例:

info_as_json = json.dumps(info)

第二个例子展示了True / true转换的发生方式。另请注意引用的更改以及注释的删除方式......

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

输出:

info = {'foo': True,  # Some insightful comment here
        'bar': 'Some string'}

# Print a condensed representation of the object
print(json.dumps(info))

# Or print a formatted version which is more human readable but uses more bytes
print(json.dumps(info, indent=2))

答案 1 :(得分:4)

不要在答案上执行eval,而是使用json模块。

答案 2 :(得分:3)

您还可以将值强制转换为布尔值。例如,假设您的数据称为“ 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

有点像hackey,但是可以用。

答案 3 :(得分:1)

{“ value”:False}或{“ key”:false}不是有效的json https://jsonlint.com/

答案 4 :(得分:1)

可以将Python的布尔值用于int,str,list等。

例如:

let s = 'background:blue; color:white;';

let results = {};
let styles = s.split(";");

for (let style in styles) {
    let properties = styles[style].split(":");
  if (properties.length === 2) {
    results[properties[0].trim()] = properties[1].trim();
  }
}

console.log(results);

在Json文件中,您可以设置

bool(1)     # True
bool(0)     # False

bool("a")   # True
bool("")    # False

bool([1])   # True
bool([])    # False

然后在您的Python代码中

"has_arrived": 0,

这里的问题是不要混淆指示为False的0和指示其值的0。

答案 5 :(得分:1)

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

答案 6 :(得分:-1)

我想再添加一件对正在读取文件的人有用的东西。

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

然后按照上述已接受的答案

data_json = json.loads(data)

答案 7 :(得分:-1)

json.loads无法解析pythons布尔类型(False,True)。 Json希望使用小写字母false,true

我的解决方案:

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