2009-11-16 5 views
20

Je dois encoder une fonction javascript dans un objet JSON en PHP.Fonctions PHP json_encode et javascript

Ce:

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

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

sorties:

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

Ce que je veux:

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

Puis-je faire avec json_encode?

Répondre

9

La spécification JSON ne prend pas en charge les fonctions. Vous pouvez écrire votre propre code pour le sortir au format JSON et cela devrait fonctionner correctement.

6

Si vous ne voulez pas écrire votre propre encodeur JSON, vous pouvez recourir à Zend_Json, l'encodeur JSON pour le Zend Cadre. Il inclut la capacité de faire face à JSON expressions.

+1

Bon Dieu, c'est génial. –

-1

Vous pouvez essayer ceci:

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

json_decode Parse le tableau donné à la chaîne JSON, de sorte que vous pouvez jouer avec comme une chaîne. Utilisez simplement une chaîne unique pour indiquer le début et la fin de la fonction. Ensuite, utilisez str_replace pour supprimer les guillemets.

$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 sortie sera:

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

Une petite variante pour pouvoir utiliser les caractères: preg_match_all ('/ \ # ([^ \ #] *) \ # /', json_encode ($ json), $ unescape); foreach ($ unescape ['0'] as $ clé => $ fn) { $ chaîne = str_replace ($ fn, json_decode ($ unescape ['0'] [$ clé]), $ chaîne); } – Allartk

-1

La partie enconding en PHP est semble résolu maintenant. Vous pouvez utiliser

json_encode($p, JSON_UNESCAPED_UNICODE)

cette façon, votre fonction ne sera pas échappé. Cependant

+0

Je ne pense pas que cela [ce que vous pensez qu'il fait] (http://php.net/manual/fr/json.constants.php#constant.json-unescaped-unicode).C'est de ne pas échapper les caractères Unicode qui n'a rien à voir avec les fonctions. – cpburnz

0

je vous écris cette fonction simple pour toutes les fonctions de base de l'aide JSON ma personne MyaBe aide:

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