如何将$.get返回的JSON字符串转换为可识别的JavaScript数组?
问题分析与解决方案
嘿,我一眼就看到几个导致你问题的关键点,咱们一个个来解决:
1. 为什么返回内容是字符串而不是数组?
你在$.get里指定了"HTML"作为dataType,这会强制jQuery把返回内容当成纯文本/HTML处理,哪怕它是标准的JSON格式。解决方案很简单:
- 把
"HTML"改成"json",这样jQuery会自动帮你把JSON字符串解析成JavaScript数组; - 或者干脆去掉这个参数,jQuery会根据响应的
Content-Type头自动识别(如果后端返回的是application/json类型的话)。
2. 异步请求的坑!
$.get是异步操作,意思是你写在回调函数外面的代码(比如后面的for循环)会在请求还没完成、events还没被赋值的时候就执行,这时候events还是undefined,自然会报错“无法获取undefined的length”。
所有依赖events的代码必须放在$.get的回调函数里面,或者用Promise/async await来处理异步逻辑。
3. for循环条件写错了
你的循环条件是i = events.length,这是赋值操作,不是判断!应该改成i < events.length,不然循环要么直接不执行,要么陷入无限循环。
修改后的完整代码
<script> function upcomingevents(){ var events, id, place, date; id = <?php if($spotlightevent != null ){echo $spotlightevent;}else{echo 0;} ?>; maineventplace = 0; // 把dataType改成json,或者直接去掉这个参数 $.get("THERE IS A LINK HERE", function(data){ events = data; // 现在data已经是解析好的数组了 // alert(typeof events); // 可以用这个验证,应该显示"object" if( id != null){ // 修正循环条件:i < events.length for(i = 0; i < events.length; i++){ if(events[i]["id"] == id){ $("#maineventtitle").text(events[i]["name"]); $("#maineventcount").text("Inscritos: " + events[i]["current_attendees"]); $("#maineventsponsor").text("Valor Patrocínios: " + <?php echo $spotlighteventsponsor; ?> + "€" ); maineventplace = i; } } } // 第二个循环也放到回调里,同样修正条件 for(i = 0; i < events.length; i++){ if(events[i]["id"] != id && i != maineventplace){ $("#secondeventtitle").text(events[i]["name"]); $("#secondneventcount").text("Inscritos: " + events[i]["current_attendees"]); } } }, "json"); // 这里改成json } // 注意:setInterval的第一个参数是函数引用,不要加(),不然只会执行一次 setInterval(upcomingevents, 30000); </script>
额外提醒
- 检查后端返回的响应头是否包含
Content-Type: application/json,这能帮助jQuery更准确地识别数据类型; - 你原本写的
setInterval(upcomingevents(), 30000)会立即执行一次函数,之后就不再触发了——因为upcomingevents()是直接调用函数,传递给setInterval的是函数的返回值(undefined),正确写法是传递函数本身setInterval(upcomingevents, 30000)。
内容的提问来源于stack exchange,提问作者Luís Miguel
相关产品推荐
相关产品推荐

