使用JSON在Python和JavaScript之间通信,以更改网站的CSS

使用JSON在Python和JavaScript之间通信,以更改网站的CSS,javascript,python,json,Javascript,Python,Json,我在解析与javascript路径相同的JSON文件时遇到问题。我已经用下面的代码试过了 var request = new XMLHttpRequest(); request.open('GET', 'data.json') request.responseType = 'json'; request.send(); request.onload = function() { var data = request.response; var jsondata = JSON.pa

我在解析与javascript路径相同的JSON文件时遇到问题。我已经用下面的代码试过了

var request = new XMLHttpRequest();
request.open('GET', 'data.json')
request.responseType = 'json';
request.send();
request.onload = function() {
    var data = request.response;
    var jsondata = JSON.parse(data);
    return jsondata;
    }

console.log(jsondata['text_06']);
但我只得到一个错误: 未捕获引用错误:webvisu.js:101中未定义jsondata

在本例中,“text_06”是来自JSON文件的字符串,如下所示:

{
 "part_count_07": 0,
 "packaging_05": false,
 "emergency_stop_06": false,
 "start_stop_08": false,
 "error_07": false,
 "beg_06": false,
 "beg2_05": false,
 "warning_08": false,
 "text_06": "magazine nearly full",
 "emergency_stop_08": false,
 "warning_07": false,
 "emergency_stop_05": true,
 "information_05": false,
 "text_05": "emergency-stop",
 "mid1_05": false,
 "start_stop_07": false,
 "packing_07": false,
 "part_count_05": 9,
 "start_stop_06": false,
 "end1_05": true,
 "emergency_stop_07": false,
 "error_06": false,
 "packing_08": false,
 "beg1_05": false,
 "beg_07": false,
 "information_08": false,
 "error_05": false,
 "warning_05": false,
 "information_06": false,
 "part_count_06": 10,
 "mid_08": true,
 "warning_06": false,
 "end_07": false,
 "mid_07": false,
 "end2_05": true,
 "beg_08": true,
 "text_07": "",
 "information_07": false,
 "extract_count": 0,
 "error_08": false,
 "end_08": false,
 "part_count_08": 1,
 "text_08": " ",
 "start_stop_05": false,
 "color_07": 0
}
我的目标是使用JSON文件中的数据更改网站上的文本和颜色,JSON文件每秒都会被以下Python脚本覆盖,该脚本已经完全可用:

while True:

    with open('data.json') as f:
        json_data = json.load(f)

    if extract_count == 0:
        ext_note = True

# Storing Station Data ST07
    db_07 = plc_07.db_read(DB_NUM_07, START_ADDRESS, SIZE_07)

    error_07 = (get_bool(db_07, 0, 0))
    warning_07 = (get_bool(db_07, 0, 1))
    information_07 = (get_bool(db_07, 0, 2))
    part_count_07 = (int.from_bytes(db_07[2:4], byteorder='big'))
    start_stop_07 = (get_bool(db_07, 4, 0))
    emergency_stop_07 = (get_bool(db_07, 4, 1))
    beg_07 = (get_bool(db_07, 4, 2))
    mid_07 = (get_bool(db_07, 4, 3))
    end_07 = (get_bool(db_07, 4, 4))
    packing_07 = (get_bool(db_07, 4, 5))
    color_07 = (int.from_bytes(db_07[6:8], byteorder='big'))
    extract_count = (int.from_bytes(db_07[8:10], byteorder='big'))
    text_07 = (get_string(db_07, 10, 266))

    if ext_note:
        set_int(db_07, 8, (json_data['extract_count']))
        set_int(db_07, 6, (json_data['color_07']))
        ext_note = False

    set_bool(db_07, 4, 0, (json_data['start_stop_07']))
    set_bool(db_07, 4, 5, (json_data['packing_07']))
    set_bool(db_07, 4, 6, True)

    plc_07.db_write(DB_NUM_07, START_ADDRESS, db_07)

# Seperating Station Data ST05
    db_05 = plc_05.db_read(DB_NUM_05, START_ADDRESS, SIZE_05)

    error_05 = (get_bool(db_05, 4, 2))
    warning_05 = (get_bool(db_05, 4, 1))
    information_05 = (get_bool(db_05, 4, 0))
    packaging_05 = (get_bool(db_05, 0, 1))
    part_count_05 = (int.from_bytes(db_05[2:4], byteorder='big'))
    start_stop_05 = (get_bool(db_05, 0, 0))
    emergency_stop_05 = (get_bool(db_05, 5, 0))
    beg1_05 = (get_bool(db_05, 4, 3))
    mid1_05 = (get_bool(db_05, 4, 4))
    end1_05 = (get_bool(db_05, 4, 5))
    beg2_05 = (get_bool(db_05, 4, 6))
    end2_05 = (get_bool(db_05, 4, 7))
    text_05 = (get_string(db_05, 6, 262))

    set_bool(db_07, 5, 1, True)

# Packaging Station Data ST08
    db_08 = plc_08.db_read(DB_NUM_08, START_ADDRESS, SIZE_08)

    error_08 = (get_bool(db_08, 0, 0))
    warning_08 = (get_bool(db_08, 0, 1))
    information_08 = (get_bool(db_08, 0, 2))
    part_count_08 = (int.from_bytes(db_08[2:4], byteorder='big'))
    start_stop_08 = (get_bool(db_08, 4, 0))
    emergency_stop_08 = (get_bool(db_08, 4, 1))
    beg_08 = (get_bool(db_08, 4, 2))
    mid_08 = (get_bool(db_08, 4, 3))
    end_08 = (get_bool(db_08, 4, 4))
    packing_08 = (get_bool(db_08, 4, 5))
    text_08 = (get_string(db_08, 6, 262))

    set_bool(db_07, 4, 6, True)

# Handling Station Data ST06
    db_06 = plc_06.db_read(DB_NUM_06, START_ADDRESS, SIZE_06)

    error_06 = (get_bool(db_06, 0, 0))
    warning_06 = (get_bool(db_06, 0, 1))
    information_06 = (get_bool(db_06, 0, 2))
    part_count_06 = (int.from_bytes(db_06[2:4], byteorder='big'))
    start_stop_06 = (get_bool(db_06, 4, 0))
    emergency_stop_06 = (get_bool(db_06, 4, 1))
    beg_06 = (get_bool(db_06, 4, 2))
    text_06 = (get_string(db_06, 6, 262))

    set_bool(db_07, 4, 3, True)

    json_data = {
        "error_07": error_07,
        "warning_07": warning_07,
        "information_07": information_07,
        "part_count_07": part_count_07,
        "start_stop_07": start_stop_07,
        "emergency_stop_07": emergency_stop_07,
        "beg_07": beg_07,
        "mid_07": mid_07,
        "end_07": end_07,
        "text_07": text_07,
        "packing_07": packing_07,
        "color_07": color,
        "extract_count": extract_count,
        "error_05": error_05,
        "warning_05": warning_05,
        "information_05": information_05,
        "packaging_05": packaging_05,
        "part_count_05": part_count_05,
        "start_stop_05": start_stop_05,
        "emergency_stop_05": emergency_stop_05,
        "beg1_05": beg1_05,
        "mid1_05": mid1_05,
        "end1_05": end1_05,
        "beg2_05": beg2_05,
        "end2_05": end2_05,
        "text_05": text_05,
        "error_08": error_08,
        "warning_08": warning_08,
        "information_08": information_08,
        "part_count_08": part_count_08,
        "start_stop_08": start_stop_08,
        "emergency_stop_08": emergency_stop_08,
        "beg_08": beg_08,
        "mid_08": mid_08,
        "end_08": end_08,
        "packing_08": packing_08,
        "text_08": text_08,
        "error_06": error_06,
        "warning_06": warning_06,
        "information_06": information_06,
        "part_count_06": part_count_06,
        "start_stop_06": start_stop_06,
        "emergency_stop_06": emergency_stop_06,
        "beg_06": beg_06,
        "text_06": text_06
    }

    json.dump(json_data, open('data.json', 'w'), indent=1)

    print(json.dumps(json_data, indent=1))
    t.sleep(1)


所以我的问题是如何正确解析JavaScript中的JSON文件并在脚本中使用它的数据。甚至可以永久读取JSON文件并根据新数据更新网站吗?

加载数据时,您可能会调用函数

request.onload = function() {
    var data = request.response;
    var jsondata = JSON.parse(data);
    dataLoaded(jsondata);
}

function dataLoaded(jsondata){
    console.log(jsondata['text_06']);
}

您的代码看起来很好,但请记住,函数中声明的变量是局部作用域,因此请将console.log放在函数中

var-request=new-XMLHttpRequest();
request.open('GET','data.json')
request.responseType='json';
request.send();
request.onload=函数(){
var数据=请求。响应;
var jsondata=JSON.parse(数据);
log(jsondata['text_06']);
返回jsondata;
}

因为
jsondata
是在回调函数
request.onload的定义中定义的,而您试图在代码块之外访问它。您可能需要在onload函数中移动
console.log

request.onload=function(){
var数据=请求。响应;
var jsondata=JSON.parse(数据);
返回jsondata;
}
console.log(jsondata['text_06']);//jsondata不可访问
还建议在定义了
request.onload
之后调用
request.send()

request.onload=function(){
var数据=请求。响应;
var jsondata=JSON.parse(数据);
log(jsondata['text_06']);
返回jsondata;
}
request.send();

如果要访问外部的
jsondata
,可能需要在onload函数外部定义一个全局变量,并在收到数据后进行更新。

我猜第101行是
console.log(jsondata['text_06']),jsondata尚未在程序流程中的该点创建感谢您的详细回答。如何更新全局变量?我不熟悉javascript,但理解它的语法仍然有问题。变量的范围取决于它的定义位置。要使其全局可访问,您可以在函数外部定义它(例如,您定义的变量
request
已经是全局变量)。但是,这是有缺陷的,因为您可能需要检查数据是否已分配给变量,因为您不知道何时调用
onload
。调用
onload
中的另一个函数(如@Kokodoko的答案中的
dataLoaded
)并传递您想要处理的数据是一种更好的做法@乔尔普菲斯特