balping / json-raw-encoder
将包含原始JS对象(例如回调函数)的数组编码为JSON
v1.0.2
2023-03-27 18:25 UTC
Requires
- php: >=7.0
Requires (Dev)
- phpunit/phpunit: ^7.1|^8.0|^9.0
This package is auto-updated.
Last update: 2024-08-27 21:45:43 UTC
README
使用此包将包含原始JS对象(例如回调函数)的数组编码为JSON。
安装
composer require balping/json-raw-encoder
用法
假设你需要将一个回调函数传递给JSON对象。
<?php
$array = [
'type' => 'cat',
'count' => 42,
'callback' => 'function(a){alert(a);}'
];
?>
<script>
let bar = <?php echo json_encode($array); ?>;
bar.callback('hello'); //error
</script>
然而,上面的数组将被编码为
{"type":"cat","count":42,"callback":"function(a){alert(a);}"}
在此对象上,你不能调用callback()
,因为callback
是一个字符串而不是一个函数。
为了解决这个问题,使用此包提供的Raw
对象
<?php
use Balping\JsonRaw\Raw;
use Balping\JsonRaw\Encoder;
$array = [
'type' => 'cat',
'count' => 42,
'callback' => new Raw('function(a){alert(a);}')
];
?>
<script>
let bar = <?php echo Encoder::encode($array); ?>;
bar.callback('hello'); //prints hello
</script>
现在,编码后的JSON看起来像这样。注意,函数周围没有引号。
{"type":"cat","count":42,"callback":function(a){alert(a);}}
现在调用bar.callback()
是可行的,因为callback
是一个函数而不是一个字符串。
与第三方库一起使用
序列化可能是由一个库(例如Fractal)完成的,而不是你的代码,即你不能用Encoder::encode()
替换json_encode
。
在这种情况下,你仍然可以通过将编码后的JSON和一个包含所有原始对象数组的数组传递给Replacer::replace()
来将回调函数传递给JSON
use Balping\JsonRaw\Raw;
use Balping\JsonRaw\Replacer;
$rawObjects = [];
$array = [
'type' => 'cat',
'count' => 42,
'callback' => $rawObjects[] = new Raw('function(a){alert(a);}')
];
// you cannot alter the behaviour of a third party encoder
$encoded = $thirdParty->jsonEncode($array);
echo Replacer::replace($encoded, $rawObjects);
结果
{"type":"cat","count":42,"callback":function(a){alert(a);}}
许可
此包根据GPLv3许可。