You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:32:44