如何用TypeScript/JS将PHP数组格式的API响应转为JSON
解决方案:将PHP数组格式响应转为JSON(TS/JS)
方法一:手动字符串解析(无依赖)
如果不想引入第三方库,可以自己写一个简单的解析函数处理常见的PHP数组格式,核心是通过字符串替换和递归处理嵌套结构:
function parsePhpArray(str) { // 移除开头的Array标识和外层括号 str = str.trim().replace(/^Array\s*\((.*)\)$/s, '$1'); let nestedCount = 0; let tempStr = ''; const nestedArrays = []; // 先提取嵌套的Array结构并递归解析 for (let i = 0; i < str.length; i++) { const char = str[i]; // 匹配到嵌套Array的起始 if (str.slice(i-5, i) === 'Array' && char === '(') { nestedCount++; tempStr += `__NESTED_${nestedArrays.length}__`; nestedArrays.push(''); i += 6; // 跳过"Array(" continue; } // 匹配到嵌套Array的结束 if (char === ')' && nestedCount > 0) { nestedCount--; // 递归解析当前嵌套数组 const nestedResult = parsePhpArray(`Array(${nestedArrays.pop().trim()})`); nestedArrays.push(JSON.stringify(nestedResult)); continue; } // 收集嵌套数组的内容 if (nestedCount > 0) { nestedArrays[nestedArrays.length - 1] += char; } else { tempStr += char; } } // 替换嵌套数组的临时标记 tempStr = tempStr.replace(/__NESTED_(\d+)__/g, (_, idx) => nestedArrays[idx]); // 转换[key] => value为JSON键值对格式 tempStr = tempStr.replace(/\[([^\]]+)\] => (\S+)/g, '"$1": "$2"'); // 清理多余换行和逗号,补全JSON大括号 tempStr = tempStr.trim() .replace(/\s+/g, ' ') .replace(/,\s*,/g, ',') .replace(/,$/, ''); return JSON.parse(`{${tempStr}}`); } // 测试使用 const phpResponse = `Array ( [hittype] => singlehit [singlehit] => Array ( ) )`; const jsonObj = parsePhpArray(phpResponse); console.log(JSON.stringify(jsonObj));
注意:这个方法只适用于结构简单的PHP数组,如果遇到带特殊字符(如空格、引号)的键值,需要额外调整正则表达式。
方法二:使用第三方库(更稳定)
用成熟的npm库php-array-parser来处理,它能覆盖更多边缘情况:
- 安装依赖:
npm install php-array-parser --save
- 在TS/JS中使用:
import { parse } from 'php-array-parser'; const phpResponse = `Array ( [hittype] => singlehit [singlehit] => Array ( ) )`; // 解析为JS对象 const parsedObject = parse(phpResponse); // 转为JSON字符串 const jsonString = JSON.stringify(parsedObject); console.log(jsonString);
最优建议
如果可以联系API提供者,直接要求将响应格式改为JSON,这是最可靠的方案——PHP原生支持json_encode()函数,后端改动成本极低,能彻底避免解析PHP数组带来的潜在问题(比如复杂嵌套、特殊字符解析错误等)。
内容的提问来源于stack exchange,提问作者Agård
相关产品推荐
相关产品推荐

