PHP返回JSON给jQuery请求解析异常及JSON输出至测试div技术咨询
疑问1:为何JSON解析方法会导致异常行为?
你在$.post请求的最后参数里指定了'json'作为dataType——这意味着jQuery已经自动帮你把PHP返回的JSON字符串解析成JavaScript对象了,完全不需要再手动调用JSON.parse()或者jQuery.parseJSON()。
当你尝试手动解析时,本质是在对一个已经是JS对象的disease_json执行解析操作,这会直接抛出语法错误(因为JSON.parse()只能处理字符串,不能解析对象)。而JavaScript遇到未捕获的错误时会终止后续代码执行,这就是调试器跳过后续代码、浏览器无输出的核心原因。
你可以快速验证这一点:在success回调里加一行console.log(typeof disease_json),控制台会输出object而非string,证明数据已经被自动解析过了。
疑问2:如何将JSON直接输出到测试中?
因为你拿到的disease_json是解析后的JS对象,直接用.append()的话,浏览器会把对象默认转换成[object Object]这类无意义的字符串。你需要用JSON.stringify()把对象重新转换成格式化的JSON字符串,再输出到<div>里:
修改后的代码示例
function showDisease(){ var disease_dropdown = document.getElementById("disease-dropdown") var disease = disease_dropdown.options[disease_dropdown.selectedIndex].text; var controller = 'controller.php'; $.post(controller, { page: 'SpaPage', command: 'search-disease', search_term: disease }, function(disease_json, status){ // 将JS对象转为带缩进的JSON字符串,方便阅读 var formattedJson = JSON.stringify(disease_json, null, 2); // 用.text()输出纯文本,避免JSON中的特殊字符被当成HTML解析 $('#test-out').text(formattedJson); var table = $.makeTable(disease_json); $('#search-results').append(table); }, 'json'); // 你的$.makeTable函数... };
这里JSON.stringify的第三个参数2是为了给JSON字符串添加缩进,提升可读性;用.text()而不是.append()是因为它会把内容当作纯文本处理,避免JSON里的<、>等字符被浏览器解析成HTML标签。
另外建议你开发时打开浏览器控制台(F12),查看Console面板的错误信息,这类解析错误能被快速定位。
内容的提问来源于stack exchange,提问作者mLstudent33

