utf8 unable rawurlencode raw escape codificar php javascript json

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; }



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(){}}