Функции PHP json_encode и javascript - PullRequest
25 голосов
/ 17 ноября 2009

Мне нужно закодировать функцию javascript в объект JSON в PHP.

Это:

$function = "function(){}";
$message = "Hello";

$json = array(   
      'message' => $message,
      'func' => $function
);
echo json_encode($json);

выходы:

{"message":"Hello","func":"function(){}"}

То, что я хочу, это:

{"message":"Hello","func":function(){}}

Могу ли я сделать это с помощью json_encode?

Ответы [ 9 ]

22 голосов
/ 17 ноября 2009

Как сказал Джани, это невозможно напрямую с JSON, но это может помочь вам: http://web.archive.org/web/20080828165256/http://solutoire.com/2008/06/12/sending-javascript-functions-over-json/

9 голосов
/ 17 ноября 2009

Нет. Спецификация JSON не поддерживает функции. Вы можете написать свой собственный код для вывода в формате, подобном JSON, и он должен работать нормально.

7 голосов
/ 17 ноября 2009

Если вы не хотите писать свой собственный кодер JSON, вы можете прибегнуть к Zend_Json, кодеру JSON для Zend Framework. Он включает в себя возможность справляться с выражениями JSON .

5 голосов
/ 03 ноября 2015

json_decode анализирует данный массив в строку json, поэтому вы можете играть с ней как со строкой. Просто используйте уникальную строку, чтобы указать начало и конец функции. Затем используйте str_replace, чтобы удалить кавычки.

$function = "#!!function(){}!!#"; 
$message = "Hello";

$json = array(   
  'message' => $message,
  'func' => $function
);
$string = json_encode($json);
$string = str_replace('"#!!','',$string);
$string = str_replace('!!#"','',$string);
echo $string;

Вывод будет:

{"message":"Hello","func":function(){}}
1 голос
/ 04 мая 2018

Я написал небольшую библиотеку , которая позволяет это делать. Это похоже на решение Zend framworks, но эта библиотека намного легче, поскольку использует встроенную функцию json_encode. Это также легче использовать с внешними библиотеками, где json_encode глубоко скрыт в коде поставщика.

<?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>
0 голосов
/ 09 июля 2017

Я пишу эту простую функцию для всех функций, основанных на json, помогите кому-нибудь помочь myabe:

function json_encode_ex($array) {
    $var = json_encode($array);
    preg_match_all('/\"function.*?\"/', $var, $matches);
    foreach ($matches[0] as $key => $value) {
        $newval = str_replace(array('\n', '\t','\/'), array(PHP_EOL,"\t",'/'), trim($value, '"'));
        $var = str_replace($value, $newval, $var);
    }
    return $var;
}
0 голосов
/ 17 февраля 2016

Заключительная часть в PHP, похоже, уже решена. Вы можете использовать

json_encode($p, JSON_UNESCAPED_UNICODE)

таким образом, ваша функция не будет экранирована. Тем не менее

0 голосов
/ 06 февраля 2016

Эта функция также может помочь:

function jsonify($var){
return str_ireplace(array("'function",'"function',"}'",'}"'),array("function",'function',"}",'}'),json_encode($var));
}

взято отсюда: http://network.convergenceservices.in/forum/105-uknowva-development/4710-introducing-convhelperjsonify-in-uknowva-251.html#4710

0 голосов
/ 14 мая 2013

Вы можете попробовать это:

var json_string = '{"message":"Hello","myfunc":"function(){ alert(this.message) }"}';
var json_string = JSON.parse(json_string, function(k,v){
    if(typeof v == 'string' && /function\(\)\{/.test(v)){
        return eval(k+' = '+v); 
    }else{
        return v
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...