Lorsque vous utilisez JSON_ENCODE pour encoder une matrice en tant que chaîne JSON, existe-t-il un moyen de prévenir la fonction de citer des valeurs spécifiques dans la chaîne retournée? La raison pour laquelle je demande est parce que j'ai besoin de JavaScript pour interpréter certaines valeurs de l'objet en tant que noms de variable réels, par exemple le nom d'une fonction JavaScript existante. P>
Mon objectif final est d'utiliser le JSON sortidé comme objet de configuration pour un composant de menu ExtJS, de sorte que tout devient indiqué empêche de définir avec succès ces propriétés en tant que "gestionnaire" (cliquez sur la fonction de gestionnaire d'événements) des articles enfants tableaux. P>
7 Réponses :
Non, json_encode ne peut pas faire ça. Vous devez construire votre expression em> à la main, puis: $json = "{'special':" . json_encode($string) . " + js_var,"
. "'value': 123}";
Ouais, c'est ce que j'avais peur, car il s'agit d'une matrice multidimensionnelle avec une profondeur inconnue de sous-tableaux qui fera la construction de cette ficelle JSON à la main une douleur majeure :-(
Écrire un petit codeur JSON de votre choix n'est pas si compliqué. Il suffit de prendre une chaîne à la PHP fournie à JSON_ENCODE pour des valeurs ordinaires (chaînes et chiffres) et avoir appelé __Tostring pour tous les objets (afin que vous puissiez jeter vos propres expressions JS). Vous n'avez probablement pas besoin de supporter du tableau ni même de récursivité. (Mais écrire tout à la main pourrait être l'option la plus simple.)
La fonction JSON_ENCODE ne fournit aucune fonctionnalité pour contrôler les devis. Les citations sont également nécessaires pour JavaScript pour former correctement l'objet sur le côté JavaScript.
Pour utiliser la valeur renvoyée pour construire un objet sur le côté JavaScript, utilisez la chaîne JSON_CODED pour définir des indicateurs dans votre association. P >
Par exemple: p>
if( json.click_handler == "FOO" ) {
json.click_handler = Your_Handler;
}
Qu'est-ce que nous faisons est (et c'est ce que Vous pouvez soit utiliser zend_json :: encode () code> fait aussi), est d'utiliser une classe spéciale marqueur em> qui encapsule des expressions javascript dans une classe spéciale . Le codage traverse ensuite de manière récursive grâce à notre tableau à codé, remplace tous les instances em> marqueur em> avec une chaîne. Après avoir utilisé l'intégré json_encode () code> nous faisons simplement une chaîne Remplacer pour remplacer chaque chaîne spéciale avec le __ tostring () code> valeur du marqueur em> > instance. p>
zend_json code> directement (si cela est possible) ou vérifier comment ils le font et adaptent le code à vos besoins. P>
C'est ce que j'ai fini par faire, ce qui est assez proche de ce que Stefan a suggéré ci-dessus, je pense:
La fonction de la facture a presque fonctionné, il a juste besoin de la fonction is_assoc () ajouté.
Mais pendant que je traitais cela, j'ai nettoyé un peu. Cela semble fonctionner assez bien pour moi: p>
Après la tête de Stefan Gehrig, je mets cette petite classe rugueuse ensemble. Exemple ci-dessous. Il faut m'empêcher d'utiliser la méthode Serialize si l'on utilise la méthode de la marque, sinon les marqueurs persistent dans la finale JSON.
class json_extended {
public static function mark_for_preservation($str) {
return 'OINK' . $str . 'OINK'; // now the oinks will be next to the double quotes
}
public static function serialize($stuff) {
$json = json_encode($stuff);
$json = str_replace(array('"OINK', 'OINK"'), '', $json);
return $json;
}
}
$js_arguments['submitHandler'] = json_extended::mark_for_preservation('handle_submit');
<script>
$("form").validate(<?=json_extended::serialize($js_arguments)?>);
// produces: $("form").validate({"submitHandler":handle_submit});
function handle_submit() {alert( 'Yay, pigs!'); }
</script>
Mon Quickfix était-ce:
{"withquotes":"mystring","withoutquotes":mystring}