rawurlencode - unable to decode value php
PHP json_encode y funciones javascript (9)
Como dijo Jani, esto no es posible directamente con JSON, pero podría ayudarte: http://web.archive.org/web/20080828165256/http://solutoire.com/2008/06/12/sending-javascript-functions-over-json/
Necesito codificar una función javascript en un objeto JSON en PHP.
Esta:
$function = "function(){}";
$message = "Hello";
$json = array(
''message'' => $message,
''func'' => $function
);
echo json_encode($json);
salidas:
{"message":"Hello","func":"function(){}"}
Lo que quiero es:
{"message":"Hello","func":function(){}}
¿Puedo hacer esto con json_encode?
Escribí una pequeña biblioteca que permite hacer esto. Es similar a la solución de Zend framworks, pero esta biblioteca es mucho más liviana ya que usa la función json_encode
incorporada. También es más fácil de usar con bibliotecas externas, donde json_encode
está profundamente json_encode
en el código del proveedor.
<?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>
Escribo esta función simple para todas las funciones basadas en json y mi myabe ayuda a alguien:
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;
}
Esta función también puede ayudar a:
function jsonify($var){
return str_ireplace(array("''function",''"function'',"}''",''}"''),array("function",''function'',"}",''}''),json_encode($var));
}
Tomado de aquí: http://network.convergenceservices.in/forum/105-uknowva-development/4710-introducing-convhelperjsonify-in-uknowva-251.html#4710
La parte que encierra en PHP parece estar resuelta por ahora. Puedes usar
json_encode($p, JSON_UNESCAPED_UNICODE)
De esta manera tu función no será escapada. sin embargo
No. La especificación JSON no admite funciones. Puede escribir su propio código para imprimirlo en un formato similar a JSON y, sin embargo, debería funcionar bien.
Puedes probar esto:
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
}
});
Si no desea escribir su propio codificador JSON, puede recurrir a Zend_Json
, el codificador JSON para el Framework Zend. Incluye la capacidad de hacer frente a las expresiones JSON .
json_decode analiza la matriz dada a la cadena json, para que puedas jugar con ella como una cadena. Simplemente use una cadena única para indicar el inicio y el final de la función. Luego usa str_replace para eliminar las comillas.
$function = "#!!function(){}!!#";
$message = "Hello";
$json = array(
''message'' => $message,
''func'' => $function
);
$string = json_encode($json);
$string = str_replace(''"#!!'','''',$string);
$string = str_replace(''!!#"'','''',$string);
echo $string;
La salida será:
{"message":"Hello","func":function(){}}