Node.js能否像PHP一样反序列化数据?PHPUnserialize调用报错如何解决?
问题原因
- 首要原因是你传入的序列化字符串包含HTML转义实体:原字符串里的
"是网页编码后的双引号,PHP序列化标准格式要求的是原生双引号",反序列化库无法识别编码后的实体,所以抛出数据类型错误。 - 次要可能是你使用的
PHPUnserialize库版本过旧、实现不完善,无法兼容PHP数组的整数索引格式。
解决步骤
- 先对序列化字符串做HTML实体解码,把所有
"替换为",如果有其他HTML实体(如</>)也同步转换。 - 建议换用维护更稳定的
php-serialize包处理反序列化,安装命令:
npm install php-serialize
- 完整实现代码参考:
const { unserialize } = require('php-serialize'); // 你的原始序列化字符串 const ignoredRaw = 'a:3:{i:19694;a:5:{s:16:"ignore_ignore_id";s:5:"19694";s:15:"ignore_messages";s:1:"1";s:17:"ignore_signatures";s:1:"1";s:13:"ignore_topics";s:1:"1";s:12:"ignore_chats";s:1:"0";}i:25895;a:5:{s:16:"ignore_ignore_id";s:5:"25895";s:15:"ignore_messages";s:1:"0";s:17:"ignore_signatures";s:1:"0";s:13:"ignore_topics";s:1:"0";s:12:"ignore_chats";s:1:"1";}i:19917;a:5:{s:16:"ignore_ignore_id";s:5:"19917";s:15:"ignore_messages";s:1:"1";s:17:"ignore_signatures";s:1:"0";s:13:"ignore_topics";s:1:"0";s:12:"ignore_chats";s:1:"0";}}'; // 替换HTML实体为原生字符 const ignored = ignoredRaw.replace(/"/g, '"'); // 反序列化 const igusers = unserialize(ignored); const ignoredids = []; // 筛选ignore_chats为1的ID for (const key in igusers) { if (igusers[key].ignore_chats === '1') { // 如需数字类型可以转Number:Number(igusers[key].ignore_ignore_id) ignoredids.push(igusers[key].ignore_ignore_id); } } // 输出结果符合预期:[ '25895' ] console.log(ignoredids);
内容的提问来源于stack exchange,提问作者Cain Nuke
相关产品推荐
相关产品推荐

