如何从javascript和python访问相同的JSON文件?

时间:2016-09-03 17:29:51

标签: javascript python json

注意:这不适用于网络编程。我们使用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)

1 个答案:

答案 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]获取字符串中第一个(和最后一个)字符之间的所有内容。等