如何从Promise返回的带pre标签的JSON响应中提取email字段值
问题原因
你当前拿到的response是JSON字符串格式,不是可直接读取属性的JavaScript对象,因此直接使用response.email、response['email']的方式无法读取到对应值。
解决方法
分为两种场景处理:
场景1:使用fetch API发起请求
需要先调用响应对象的.json()方法,将返回的JSON字符串解析为JS对象:
responseData // 新增这一步解析JSON内容 .then(response => response.json()) .then(parsedData => { // 此时可以正常读取属性 console.log(parsedData.email); // 输出 FOUND console.log(parsedData.password); // 输出 MATCH })
场景2:已经拿到字符串形式的响应内容
直接使用JSON.parse()手动转换为JS对象即可:
const parsedData = JSON.parse(response); console.log(parsedData.email); // 输出 FOUND
额外优化建议
为了避免解析异常,建议对PHP侧的返回逻辑做两处调整:
- 输出JSON前先设置正确的响应头,告知前端返回内容为JSON格式
- 不要用自定义的
print_r2函数输出,直接用echo输出JSON内容后终止程序,避免多余的调试信息、空白字符污染JSON结构 - 注意
json_encode的第二个参数为格式选项,不需要传true,你可能是和json_decode的参数混淆了
修正后的PHP代码参考:
if(count($user) == 1){ $response['email'] = 'FOUND'; if($_POST['formPassword'] == $user[0]['password']){ $response['password'] = 'MATCH'; }else{ $response['password'] = 'NO MATCH'; } }else if(count($user) == 0){ $response['email'] = 'NOT FOUND'; }else{ $response['email'] = 'DATABASE CORRRRUPT'; } // 新增响应头设置 header('Content-Type: application/json; charset=utf-8'); // 直接输出JSON,终止后续逻辑 echo json_encode($response); exit;
内容的提问来源于stack exchange,提问作者DCR
相关产品推荐
相关产品推荐

