【问题标题】:How to access the same JSON file from both javascript and python?如何从 javascript 和 python 访问相同的 JSON 文件?
【发布时间】:2016-09-03 17:29:50
【问题描述】:

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

【问题讨论】:

  • 您不想像加载 JavaScript 一样加载 JSON 文件。你应该把它当作一个字符串来读,然后交给JSON.parse()。 (或者使用从文件中解析 JSON 的函数。)
  • 那么load() 是从哪里来的,文档说它是做什么的?难道load() 执行 加载的文件没有返回任何东西?
  • 如果 load() 执行数据,您可以将数据格式化为 JSONP(在 Python 中加载时,您必须从文件中删除 JSONP 函数调用)。
  • @MartijnPieters 你是完全正确的, load() 确实执行了代码。我只是试图在加载的文件中打印一些东西,它确实打印出来了。你能解释一下 JSONP 在这种情况下如何帮助我吗?没有太多的文档。

标签: javascript python json


【解决方案1】:

看起来像load() 执行指定的文件,而不是读取它并返回内容。如果这是您读取另一个文件的唯一选项,那么我建议您使用JSONP 而不是 JSON。

JSONP 通过在数据周围添加 callback 来工作。而不是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多