如何在PHP中将非JSON的JavaScript对象字符串转为JSON?
解决JS对象字符串转标准JSON的两种方案
你遇到的情况很常见——数据库存的是合法JS对象但不是标准JSON,没法直接用json_decode解析,下面给你两种可行的处理方式,根据你的场景选就行:
方案一:PHP服务端转换
核心思路是用正则给无引号的JS对象键加上双引号,把字符串转换成标准JSON格式,之后就能正常解析和编码了。
基础实现代码
<?php $string = '{trees : {key: "value", id: 1}, animals : {key:"value", id: 2}}'; // 给所有合法JS标识符键添加双引号(覆盖字母、数字、下划线、$开头的键) $jsonCompatibleString = preg_replace('/([a-zA-Z_\$][\w\$]*)\s*:/', '"$1":', $string); // 解析为PHP数组,再转成标准JSON $standardJson = json_encode(json_decode($jsonCompatibleString)); echo $standardJson; // 输出:{"trees":{"key":"value","id":1},"animals":{"key":"value","id":2}} ?>
如果你需要把数字ID转为字符串
如果要和你期望的结果一致,把id的数字值转成字符串,可以在解析后手动处理:
<?php $string = '{trees : {key: "value", id: 1}, animals : {key:"value", id: 2}}'; $jsonCompatibleString = preg_replace('/([a-zA-Z_\$][\w\$]*)\s*:/', '"$1":', $string); // 解析为关联数组 $data = json_decode($jsonCompatibleString, true); // 转换ID为字符串 $data['trees']['id'] = (string)$data['trees']['id']; $data['animals']['id'] = (string)$data['animals']['id']; $standardJson = json_encode($data); echo $standardJson; // 输出:{"trees":{"key":"value","id":"1"},"animals":{"key":"value","id":"2"}} ?>
方案二:前端JS直接处理
如果不想在服务端折腾,可以把原字符串直接传给前端,利用JS本身能解析对象字面量的特性来处理,但务必保证字符串是完全可信的(比如来自自己数据库,没有用户可控的恶意内容)。
代码示例
// 假设从后端获取到的原字符串 const jsObjString = '{trees : {key: "value", id: 1}, animals : {key:"value", id: 2}}'; // 方法1:使用eval(注意风险,仅可信字符串可用) const parsedObj = eval(`(${jsObjString})`); // 方法2:用Function构造函数,逻辑和eval类似,但写法更清晰 const parsedObj2 = new Function(`return ${jsObjString}`)(); // 转成标准JSON字符串(或者直接使用parsedObj对象) const standardJson = JSON.stringify(parsedObj); console.log(standardJson);
注意事项
- 前端方案的
eval和Function都存在代码注入风险,如果字符串可能包含不可信内容,一定要用服务端方案处理。 - 服务端的正则已经覆盖了所有合法JS标识符键的场景,如果你的键有特殊字符(比如连字符),那原字符串其实不是合法的JS对象(JS里带特殊字符的键必须加引号),这种情况你可能需要调整正则或者提前处理。
内容的提问来源于stack exchange,提问作者TVBZ
相关产品推荐
相关产品推荐

