probl=c3=a8me json entre php et javascript

11 réponses
Avatar
Une B=c3=a9vue
Problème curieux j'obtiens :

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the
JSON data [Learn More]

Le lien "[Learn More]" renvoit à la page MDN :
SyntaxError: JSON.parse: bad parsing
<https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/JSON_bad_parse?utm_source=mozilla&utm_medium=firefox-console-errors&utm_campaign=default>

Avec le script php qui envoit du json :
$data['text'] = 'html {
background: transparent url(http://mbp.local/global/backgrounds/'.
$files[$rand] . ') no-repeat center center fixed;background-size: cover;}';
$data['background'] = 'transparent
url(http://mbp.local/global/backgrounds/'. $files[$rand] . ') no-repeat
center center fixed';
$data['background-image'] =
'url(http://mbp.local/global/backgrounds/'. $files[$rand] . ')';
$data['backgroundSize'] = 'cover';
echo json_encode( $data );

$files représente les fichiers contenus dans un répertoire et $rand un
nombre aléatoire pointant sur un de ces fichiers.

ce fichier php est lu depuis JavaScript par le code :
JSON.fetch = function(url, callback) {
fetch(url)
.then(function (response) {
return response.json();
})
.then(function (json) {
callback(json);
});
};

utilisé de cette manière :
getBackground () {
JSON.fetch("http://mbp.local/php/background-json.php",
this.setBackground);
};

avec la fonction calback "setBackground" :
setBackground(json) {
if(json.hasOwnProperty('background-image')) {
document.body.style.backgroundImage = json['background-image'];
}
};

bon, mise à part cette erreur dans la console (firefox ou Safari), ça
tourne comme je le veux.

si je pointe un butineur sur "http://mbp.local/php/background-json.php":
j'obtiens :
{"text":"html { \n background: transparent
url(http:\/\/mbp.local\/global\/backgrounds\/cerveaulent_recadre.png)
no-repeat center center fixed;background-size:
cover;}","background":"transparent
url(http:\/\/mbp.local\/global\/backgrounds\/cerveaulent_recadre.png)
no-repeat center center
fixed","background-image":"url(http:\/\/mbp.local\/global\/backgrounds\/cerveaulent_recadre.png)","backgroundSize":"cover"}

ce qui est tout à fait ***normal***
(à mois que je loupe qqc...)

si je lis cet url avec wget j'obtiens exactement la même chose, à savoir
que le "{" est bien le premier caractère et le "}" le dernier.

je ne pige pas ???

10 réponses

1 2
Avatar
SAM
Le 02/05/17 à 17:37, Une Bévue a écrit :
si je lis cet url avec wget j'obtiens exactement la même chose, à savoir
que le "{" est bien le premier caractère et le "}" le dernier.

et il n'y a vraiment pas un espace avant le {
?
espace qui peut être un retour à la ligne
Cordialement,
--
Stéphane Moriaux avec/with iMac-intel 27" & Mac OS X 10.6.8
Avatar
Olivier Miakinen
Le 02/05/2017 17:56, SAM a écrit :
Le 02/05/17 à 17:37, Une Bévue a écrit :
si je lis cet url avec wget j'obtiens exactement la même chose, à savoir
que le "{" est bien le premier caractère et le "}" le dernier.

et il n'y a vraiment pas un espace avant le {
?
espace qui peut être un retour à la ligne

... ou un BOM (invisible).
--
Olivier Miakinen
Avatar
Une B=c3=a9vue
Le 02/05/2017 à 17:56, SAM a écrit :
et il n'y a vraiment pas un espace avant le {
?
espace qui peut être un retour à la ligne

non, je viens de lire avec un Hex éditeur (Hex Fiend) :
les premiers caractères :
7B227465 - {"te
les derniers caractères :
76657222 7D - ver"}
d'après :
<http://www.asciitable.com/>
7B semble correct pour "{"
7D semble correct pour "}"
Avatar
Une B=c3=a9vue
Le 02/05/2017 à 18:51, Olivier Miakinen a écrit :
... ou un BOM (invisible).

même avec un éditeur hexa ?
Avatar
Une B=c3=a9vue
Il me semble que ce soit résolu en remplaçant :
header('Content-Type: application/javascript');
par :
header('Content-Type: application/json; charset=utf-8');
(suite à discussion sur comp.lang.php le fr.comp.lang.php ne répondant pas)
Avatar
Une B=c3=a9vue
Le 03/05/2017 à 07:28, Une Bévue a écrit :
Il me semble que ce soit résolu en remplaçant :

euh j'étais trop optimiste :
SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the
JSON data
mais il me semble qu'il y en a moins...
Avatar
Olivier Miakinen
Le 02/05/2017 19:06, Une Bévue a écrit :
Le 02/05/2017 à 18:51, Olivier Miakinen a écrit :
... ou un BOM (invisible).

même avec un éditeur hexa ?

Non, tu as raison. Avec un éditeur hexa tu ne peux pas passer à
côté du BOM s'il en existe un.
--
Olivier Miakinen
Avatar
Une B=c3=a9vue
Le 04/05/2017 à 17:35, Olivier Miakinen a écrit :
Non, tu as raison. Avec un éditeur hexa tu ne peux pas passer à
côté du BOM s'il en existe un.

bon, ben il n'y en a pas...
l'erreur est ailleurs...
merci bien
Avatar
Une B=c3=a9vue
Le 04/05/2017 à 17:35, Olivier Miakinen a écrit :
Non, tu as raison. Avec un éditeur hexa tu ne peux pas passer à
côté du BOM s'il en existe un.

bon j'ai trouvé mon erreur grâce au butineur Vivaldi, qui m'a donné une
piste :
Seul Vivalddi, en effet, m'a indiqué que le caractère fautif était un
"<", alors là j'ai tout de suite pensé que php, au lieu de m'envoyer du
json, ne pouvait m'envoyer qu'un message d'erreur du genre :
<span style="color: red;">Tu as fait une erreur Yvon...</span>
Mon erreur était toute bête et n'avait rien à voir avec le json.
j'avais :
$count = count($files);
$rand = rand(0, $count);
$count étant le nombre de fichier dans un réertoire.
$rand indexe aléatoirement un de ces fichiers, sauf que :
int rand($min, $max)
retourne un entier compris entre $min et $max ***inclusivement***
j'ai du donc corriger en :
$rand = rand(0, $count - 1);
That's all folks !
Avatar
Olivier Miakinen
Le 08/05/2017 07:55, Une Bévue a écrit :
Seul Vivalddi, en effet, m'a indiqué que le caractère fautif était un
"<"

???
Tu as écrit que la page renvoyait ceci, vérifié avec un éditeur hexa :
====================================================================== {"text":"html { n background: transparent
url(http://mbp.local/global/backgrounds/cerveaulent_recadre.png)
no-repeat center center fixed;background-size:
cover;}","background":"transparent
url(http://mbp.local/global/backgrounds/cerveaulent_recadre.png)
no-repeat center center
fixed","background-image":"url(http://mbp.local/global/backgrounds/cerveaulent_recadre.png)","backgroundSize":"cover"}
======================================================================
et que l'erreur était sur le premier caractère de la première ligne :
====================================================================== SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the
JSON data [Learn More]
======================================================================
Comment alors le caractère fautif peut-il être un "<" ???
--
Olivier Miakinen
1 2