[RESOLU] Deux-points en json

Eléphanteau du PHP | 43 Messages

19 juin 2018, 14:46

Bonjour, j'essaye de convertir un array en json, cependant, cela me donne une erreur vu qu'il y a un lien avec deux-points. Comment puis je faire pour faire escape ce caractère ?

Exemple
{"title":"<p>gfgfgfest<math xmlns=\"http:\/\/www.w3.org\/1998\/Math\/MathML\">"}
Erreur (en JS):
Unexpected token h in JSON at position 68
Cordialement

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

19 juin 2018, 14:55

Bonjour,

A mon avis le problème ne vient pas des deux-points mais plutôt de la guillemet double qui ne doit pas être échappé correctement (même si dans l'extrait de ton code ça parait correct), surtout que le message d'erreur parle d'un "h" qui correspond au caractère juste après la double guillemet.

Par contre, je ne sais pas comment tu fais ta conversion en JSON mais PHP a une fonction qui fait normalement ça très bien :
https://php.net/json_encode
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 43 Messages

19 juin 2018, 15:09

C'est exactement ce que je fait:
json_encode($data);
Disons que je fait seulement ca:
<?php $data['title'] = '<math xmlns="http//:www.w3.org/1998/Math/MathML">';
Puis que je le converti comme tantôt, cela me fait la même erreur... Si quelqu'un a eu une idée, je suis prenant :D

Cordialement

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

19 juin 2018, 23:10

Donne nous un extrait qui ne fonctionne pas car si je teste ce que tu nous as donné, ça fonctionne :
<?php

$data['title'] = '<math xmlns="http//:www.w3.org/1998/Math/MathML">';

// transformation en JSON
$json_data=json_encode($data);

// Affichage du JSON
echo htmlentities($json_data);
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 43 Messages

19 juin 2018, 23:18

Par exemple, je fait ceci:
$testjson['title'] = '<math xmlns="http//:www.w3.org/1998/Math/MathML">';
Puis en js:
var data = JSON.parse('<?php echo json_encode($testjson) ?>');
Ce qui est affiché au client est:
var data = JSON.parse('{"title":"<math xmlns=\"http\/\/:www.w3.org\/1998\/Math\/MathML\">"}');
Et j'obtiens cette erreur:
Uncaught SyntaxError: Unexpected token h in JSON at position 23
Cordialement

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 juin 2018, 00:00

Ah oui tiens c'est original comme problème, 1ère fois que je tombe dessus !

Voici une piste (à voir si ça ne casse pas le reste de ton code), perso j'ajouterai le paramètre JSON_HEX_QUOT à ta fonction json_encode() afin d'encoder en hexadécimal les guillemets double.
https://secure.php.net/json_encode
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 43 Messages

20 juin 2018, 00:19

Cela ne fonctionnait pas, mais ça m'a donné une idée j'ai rajouté addslashes avant la conversion. Donc maintenant j'ai:
$testjson['title'] = addslashes('<math xmlns="http//:www.w3.org/1998/Math/MathML">');
De cette manière cela me donne:
{"title":"<math xmlns=\\\"http:\/\/www.w3.org\/1998\/Math\/MathML\\\">"}
et ça passe !

Merci de votre aide !