注意:这不适用于网络编程。我们使用javascript与低级硬件进行交互,因此不要使用jQuery API等。
我有一个javascript文件,它在设备上执行一系列操作,我有一个python文件,稍后会调用它来验证这些操作。在javascript文件和python文件中都有一组硬编码的硬件信息。我希望通过将这些信息放入JSON文件来避免这种重复信息,这样两者都可以访问它。
// Javascript
var hardware_info = JSON.parse(load('hardware.json'));
// load() is probably not standard javascript API, but it basically copies that code into the existing script.
此步骤已失败,因为' hardware.json
'没有使用javascript语法...
我已经使用jshint / jslint验证了json,hardware.json
看起来像这样:
{
"hardware1": {
"ID": "xxx"
},
"hardware2": {
"ID": "yyy"
}
}
以下Python适用于访问json,没有太多内容:
with open('hardware.json', 'r') as f:
data = json.load(f)
答案 0 :(得分:2)
看起来load()
执行指定的文件,而不是读取它并返回内容。如果这是您的 only 选项以读取其他文件,那么我建议您使用JSONP而不是JSON。
JSONP的工作原理是在数据周围添加回调。而不是:
{"key": "value"}
该文件包含一个带有传入数据的函数调用:
callback({"key": "value"});
这意味着由JavaScript引擎执行,使其执行回调。 load()
将执行您的文件,并且作为结果调用回调函数,传入数据。
在Web上使用时,您将调用JSONP服务并传入服务应添加的回调的名称,但是当只是在JS引擎和Python之间共享配置文件时,您需要对该回调名称进行硬编码
在Python中,您必须在将回调文本作为JSON数据加载之前将其删除。这可能就像删除前N个和前M个字符一样简单:
with open('hardware.json', 'r') as f:
jsonp_data = f.read()
# remove first 9 and last 3 characters to remove JSONP callback
data = json.loads(jsonp_data[9:-3])
一种更复杂的技术可以使用换行符:
callback(
{"key": "value"}
);
可以更轻松地删除Python中的第一行和最后一行。或者,您可以使用jsonp_data.partition('(')[-1].jsonp.rpartition(')')[0]
获取字符串中第一个(
和最后一个)
字符之间的所有内容。等