使用jQuery从JSON获取数据时出现TypeError错误求助
你遇到的问题是,虽然服务器返回了正确的JSON数据,但在使用$.each遍历时触发了TypeError,错误提示不能用'in'操作符在字符串中搜索'length'。先理清楚关键信息:
- 错误信息:
jQuery-2.1.4.min.js:2 Uncaught TypeError: Cannot use 'in' operator to search for 'length' in [{"name":"1.xlsx","size":34838},{"name":"485138_1.xlsx","size":34838}] at s (jQuery-2.1.4.min.js:2) at Function.each (jQuery-2.1.4.min.js:2) at Object.success (misupload.js:111) at j (jQuery-2.1.4.min.js:2) at Object.fireWith [as resolveWith] (jQuery-2.1.4.min.js:2) at x (jQuery-2.1.4.min.js:4) at XMLHttpRequest.
(jQuery-2.1.4.min.js:4)
- 你的JS代码:
$.get('/resumes/mis-upload-get-action?_act=bulk', function(data) { $.each(data, function(key,value){ var mockFile = { name: value.name, size: value.size}; thisDropzone.options.addedfile.call(thisDropzone, mockFile); totalFiles += 1; completeFiles += 1; }); $('.btn-proceed .badge').html(totalFiles); });
- 服务器返回的JSON:
[{"name":"1.xlsx","size":34838},{"name":"485138_1.xlsx","size":34838}]
问题原因
核心问题是数据类型不匹配:服务器返回的是JSON格式的字符串,但$.get默认情况下没有自动将这个字符串解析为JavaScript数组/对象。当你直接用$.each遍历这个字符串时,jQuery会把它当成单个字符序列处理,而非你期望的数组,这就导致遍历逻辑出错,触发了TypeError。
解决方案
这里提供两种可靠的解决方法,任选其一即可:
方法1:指定$.get的dataType为'json'
直接在$.get的参数末尾添加'json',让jQuery自动帮你把返回的字符串解析为JSON对象:
$.get('/resumes/mis-upload-get-action?_act=bulk', function(data) { $.each(data, function(key,value){ var mockFile = { name: value.name, size: value.size}; thisDropzone.options.addedfile.call(thisDropzone, mockFile); totalFiles += 1; completeFiles += 1; }); $('.btn-proceed .badge').html(totalFiles); }, 'json'); // 手动指定返回数据类型为JSON
方法2:手动解析JSON字符串
如果服务器返回的响应头没有正确设置Content-Type: application/json,你可以用JSON.parse()手动将字符串转为JavaScript对象:
$.get('/resumes/mis-upload-get-action?_act=bulk', function(data) { // 手动解析JSON字符串为数组 var parsedData = JSON.parse(data); $.each(parsedData, function(key,value){ var mockFile = { name: value.name, size: value.size}; thisDropzone.options.addedfile.call(thisDropzone, mockFile); totalFiles += 1; completeFiles += 1; }); $('.btn-proceed .badge').html(totalFiles); });
额外建议:你也可以检查服务器端的响应配置,确保返回的Content-Type头是application/json,这样jQuery通常会自动完成解析,无需额外设置。
内容的提问来源于stack exchange,提问作者user9240510

