公司项目都是以 PHP 为主,最近搞几个 go 项目需要 rpc 调取以前 PHP 写的服务。
但是内部的 PHP 服务都是通过 PHP 的 serialize()
函数序列化的。所以就想找找 go 有没有 unserialize()
的函数。
github 找了几个包, 大部分都是把 PHP 的 array 解析成了 map ,并且类型是 map[interface{}]interface{}
然后就遇到下一个问题 没法转 json。
虽然暂时修改了下包 把返回值变成了 map[string]interface{}
但是还一个问题就是 没法正确的区分是不是数组。
所以就来请教下万能的 V2er,go 有没有好用的 phpserialize 函数, 可以准确区分 array 和 map 的那种
1
GTim 2019-03-21 11:18:22 +08:00
目前没发现,提供你一个 hook 方法,生成了 map[string]interface{} 后,判断 key 是不是连续的整数字符串即可
PHP serialize 数组 [1,2,3,4,6] 序列化后生成的数据为 a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:6;} 只要是数组,下标一定从 0 开始,结尾一定是长度 -1,而且连续 |
2
GTim 2019-03-21 11:25:42 +08:00
@GTim 接上
为什么 其它语言实现的几乎都是 Map,是因为 serialize 序列化后的结果,数组和哈希表是没啥区别的,唯一的区别就是键的类型是否有 i 或 s. 1. 只要出现 s,那么必须是 map 2. 全部都是 i , 如果最后的每个键都自增,那么就是 array 3. 否则,还是 map <?php $person = [1,2,3,4,6]; echo serialize($person); echo "\n\n"; $person = [1, 10 => 2,3,4,6]; echo serialize($person); echo "\n\n"; $person = [ 'name' => 'yufei', 'age' => 28, 'address' => 'dd' ]; echo serialize($person); echo "\n\n"; $person = [ '88', 'name' => 'yufei', 'age' => 28, 'address' => 'dd', '99' ]; echo serialize($person); echo "\n\n"; $person = [[ 'name' => 'yufei', 'age' => 28, 'address' => 'dd' ], [ 'name' => 'yufei', 'age' => 28, 'address' => 'dd' ] ]; echo serialize($person); echo "\n\n"; 结果如下 a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:6;} a:5:{i:0;i:1;i:10;i:2;i:11;i:3;i:12;i:4;i:13;i:6;} a:3:{s:4:"name";s:5:"yufei";s:3:"age";i:28;s:7:"address";s:2:"dd";} a:5:{i:0;s:2:"88";s:4:"name";s:5:"yufei";s:3:"age";i:28;s:7:"address";s:2:"dd";i:1;s:2:"99";} a:2:{i:0;a:3:{s:4:"name";s:5:"yufei";s:3:"age";i:28;s:7:"address";s:2:"dd";}i:1;a:3:{s:4:"name";s:5:"yufei";s:3:"age";i:28;s:7:"address";s:2:"dd";}} |
3
Junjunya OP |
4
GTim 2019-03-21 11:35:44 +08:00
|
5
Junjunya OP @GTim 已经实现了 map[string]interface{}了, 项目比较紧,暂时这样可以满足需求,就没进一步改。
稍微有时间之后继续改改。 感谢大佬,我也是翻了翻 github 没找到合适的 |
6
Trim21 2022-07-18 03:23:19 +08:00 via Android
我最近写了一个,如果你知道序列化之前是数组还是 map 的话,那用法跟 json 包一样… https://github.com/Trim21/go-phpserialize
|