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

PHP无法用print_r打印解码后JSON 如何提取command属性的tableName值

PHP提取JSON中tableName值解决方案

问题原因

  • JSON解析失败无输出:原始字符串中的双引号被编码为HTML实体",不符合JSON语法规范,导致json_decode返回null。
  • 反序列化后无法访问tableName:tableName是App\Jobs\SendReport类的受保护(protected)属性,序列化时会添加\0*\0前缀标记,外部无法直接通过对象属性名访问。

实现代码

方案1:标准解码方案(推荐)

先还原HTML实体再解析JSON,反序列化时开启未定义类兼容,直接读取带前缀的属性:

// 你的原始字符串
$rawStr = '{"uuid":"3ed79fdc-6ef0-441b-b9b0-525eeaebf183","displayName":"App\\Jobs\\SendReport","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"maxExceptions":null,"failOnTimeout":false,"backoff":null,"timeout":null,"retryUntil":null,"data":{"commandName":"App\\Jobs\\SendReport","command":"O:19:\"App\\Jobs\\SendReport\":11:{s:12:\"\u0000*\u0000tableName\";s:9:\"employees\";s:3:\"job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:19:\"chainCatchCallbacks\";N;s:5:\"delay\";N;s:11:\"afterCommit\";N;s:10:\"middleware\";a:0:{}s:7:\"chained\";a:0:{}}"}}';

// 还原HTML实体为正常字符
$jsonStr = htmlspecialchars_decode($rawStr);
// 解析JSON为数组
$payload = json_decode($jsonStr, true);
// 反序列化command,允许未定义类避免报错
$command = unserialize($payload['data']['command'], ['allowed_classes' => false]);
// 读取带保护属性前缀的key
$tableName = $command["\x00*\x00tableName"];

echo $tableName; // 输出:employees

方案2:正则提取方案(兼容性更高)

无需解析JSON和反序列化,直接匹配固定格式的表名,自动适配不同长度的表名:

// 你的原始字符串
$rawStr = '{"uuid":"8c4640de-599c-4795-bffe-b043cf74a226","displayName":"App\\Jobs\\SendReport","job":"Illuminate\\Queue\\CallQueuedHandler@call","maxTries":null,"maxExceptions":null,"failOnTimeout":false,"backoff":null,"timeout":null,"retryUntil":null,"data":{"commandName":"App\\Jobs\\SendReport","command":"O:19:\"App\\Jobs\\SendReport\":11:{s:12:\"\u0000*\u0000tableName\";s:11:\"departments\";s:3:\"job\";N;s:10:\"connection\";N;s:5:\"queue\";N;s:15:\"chainConnection\";N;s:10:\"chainQueue\";N;s:19:\"chainCatchCallbacks\";N;s:5:\"delay\";N;s:11:\"afterCommit\";N;s:10:\"middleware\";a:0:{}s:7:\"chained\";a:0:{}}"}}';

// 正则匹配tableName对应的值,忽略长度前缀
preg_match('/\\\u0000\*\\\u0000tableName\";s:\d+:\"([^\"]+)\"/', $rawStr, $match);
$tableName = $match[1] ?? '';

echo $tableName; // 输出:departments

内容的提问来源于stack exchange,提问作者Freddy Daniel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:03:02