在Python中迭代包含数组的JavaScript对象

2 投票
2 回答
517 浏览
提问于 2025-04-18 12:48

我有一堆文本框用来获取用户输入。当用户点击一个“完成”按钮(就是一个普通按钮)时,我会收集所有的输入,把它们存储在一个关联数组里,然后传递给我的Python方法。

这些数据的样子是这样的:

enter image description here

接着我把这些数据转换成JSON格式,然后发送给我的Python函数:

$.ajax({
        url: "http://127.0.0.1:6543/create_device",
        type: "POST",
        data: JSON.stringify(data),
        contentType: 'application/json; charset=utf-8',
        success: function (response, textStatus, jqXHR) {
            alert("done");
        },
        error: function (jqXHR, textStatus, errorThrown) {
            //change this back to error throwing after wards
            alert("error");
        }
    });

在我的Python函数里,我有这样的代码:

def create_device(request):
#get the json data from the ajax call
data = request.json_body

for key in data:
    print "key: " + key

现在的问题是,我不太确定怎么遍历存储在genericDatastaticData里的数组。当我尝试遍历它们时,似乎只是在遍历单词里的字符,而不是数组。这是我的JavaScript代码(可以参考图片看看数据的样子):

    data = {
    'staticData': staticData,
    'genericData': genericData
}

编辑

这是看起来有效的代码,但我的数组是空的,我完全不知道为什么。

for key in data:
    for val in data[key]:
        print "-----------------" + val

2 个回答

2

你有两个数组,但你把它们当成了“关联数组”或者“字典”,甚至是“对象”来用,这在JavaScript中是可以的,因为你可以给数组随便加属性:

var a = []; // equivalent to a = new Array();
a.foo = 'boo';

不过这些数组一直都是空的:

console.log(a.foo); // prints 'boo'
console.log(a['foo']); // equivalent to the above, prints 'boo'
console.log(a.length); // 0 - the array is empty
console.log(a[0]); // undefined

所以当它们被传给JSON.stringify时,它们就被简单地转成了空数组:[]。因为很明显,当JSON序列化器看到一个数组时,它会把它当成数组来处理,而不是对象……

在你的截图中,你可以看到这一点:你有一个长度为零的数组,里面加了一些额外的属性。

这确实是个很有创意的自我伤害方式 :))

进一步阅读:

2

在我的JavaScript代码中,我把 genericDatastaticData 定义成了 = new Array()。后来我改成了这样:

    var genericData = {};
    var staticData = {};

然后其他的部分都没变:

var data = { 'genericData' : genericData, 'staticData': staticData };
JSON.strinify(data).

现在我的Python代码按照我想要的方式运行了。

撰写回答