balping/json-raw-encoder

将包含原始JS对象(例如回调函数)的数组编码为JSON

v1.0.2 2023-03-27 18:25 UTC

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许可。

下载统计

statistics