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

接着我把这些数据转换成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
现在的问题是,我不太确定怎么遍历存储在genericData
和staticData
里的数组。当我尝试遍历它们时,似乎只是在遍历单词里的字符,而不是数组。这是我的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序列化器看到一个数组时,它会把它当成数组来处理,而不是对象……
在你的截图中,你可以看到这一点:你有一个长度为零的数组,里面加了一些额外的属性。
这确实是个很有创意的自我伤害方式 :))
进一步阅读:
- 关于数组的MDN文章
- JavaScript的“关联数组”被认为是有害的(很好地说明了这个问题)
2
在我的JavaScript代码中,我把 genericData
和 staticData
定义成了 = new Array()
。后来我改成了这样:
var genericData = {};
var staticData = {};
然后其他的部分都没变:
var data = { 'genericData' : genericData, 'staticData': staticData };
JSON.strinify(data).
现在我的Python代码按照我想要的方式运行了。