web-dev-qa-db-fra.com

Pourquoi json_encode ajoute-t-il des barres obliques inverses?

J'utilise json_encode depuis longtemps et je n'ai eu aucun problème jusqu'à présent . Maintenant, je travaille avec un script de téléchargement et j'essaie de renvoyer des données JSON après le téléchargement du fichier.

J'ai le code suivant:

print_r($result); // <-- This is an associative array
echo json_encode($result); // <-- this returns valid JSON

Cela me donne les résultats suivants:

// print_r result
Array
(
    [logo_url] => http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg
    [img_id] => 54
    [feedback] => Array
        (
            [message] => File uploaded
            [success] => 1
        )

)

// Echo result
{"logo_url":"http:\/\/mysite.com\/uploads\/gallery\/7f\/3b\/f65ab8165d_logo.jpeg","img_id":"54","feedback":{"message":"File uploaded","success":true}}

Quelqu'un peut-il me dire pourquoi json_encode ajoute des barres obliques?

mettre à jour  

@Quentin a dit qu'il se passait quelque chose entre json_encode et .parseJSON et qu'il a raison.

Faire un alert(data.toSource()); me donne le résultat suivant:

({response:"{\"logo_url\":\"http:\\/\\/storelocator.com\\/wp-content\\/uploads\\/gallery\\/7f\\/3b\\/71b9520cfc91a90afbdbbfc9d2b2239b_logo.jpeg\",\"img_id\":\"62\",\"feedback\":{\"message\":\"File uploaded\",\"success\":true}}", status:200})

Et ce n'est pas JSON valide. Il ajoute également le status:200 et je ne sais pas d’où cela vient.

Se pourrait-il que le Plupload bind fasse quelque chose à mes données retournées?

Ceci est mon script js:

  uploader.bind('FileUploaded', function(up, file, data) {
    alert(data.toSource());
    $('#' + file.id + " b").html("100%");
  });
40
Steven

Quelqu'un peut-il me dire pourquoi json_encode ajoute des barres obliques?

Les barres obliques peuvent provoquer des problèmes (lorsqu'ils sont précédés d'un <, ils déclenchent les règles SGML pour "l'élément de fin de script") lorsqu'ils sont incorporés dans un élément de script HTML. Ils sont échappés par précaution.

Parce que quand j'essaie, utilisez jQuery.parseJSON (réponse); dans mon script js, il retourne null. Donc, je suppose que cela a quelque chose à voir avec les barres obliques.

Ce n'est pas. En JSON, "/" et "\/" sont équivalents. 

Le JSON que vous avez inscrit dans la question est valide (vous pouvez le tester avec jsonlint ). Votre problème est susceptible de faire avec ce qui lui arrive entre json_encode et parseJSON.

35
Quentin

Utilisez simplement l'option "JSON_UNESCAPED_SLASHES" (ajoutée après la version 5.4).

json_encode($array,JSON_UNESCAPED_SLASHES);
58
reirracon

Je viens juste de rencontrer ce problème dans certains de mes scripts aussi, et cela semblait se produire parce que j'appliquais json_encode à un tableau encapsulé dans un autre tableau qui était également codé json. C'est facile à faire si vous avez plusieurs boucles foreach dans un script qui créent les données. Toujours appliquer json_encode à la fin.

Voici ce qui se passait. Si tu fais:

$data[] = json_encode(['test' => 'one', 'test' => '2']);
$data[] = json_encode(['test' => 'two', 'test' => 'four']);
echo json_encode($data);

Le résultat est:

["{\"test\":\"2\"}","{\"test\":\"four\"}"]

Donc, ce que vous devez réellement faire est:

$data[] = ['test' => 'one', 'test' => '2'];
$data[] = ['test' => 'two', 'test' => 'four'];
echo json_encode($data);

Et cela va revenir

[{"test":"2"},{"test":"four"}]
27
Meezaan-ud-Din

Cela est dû au fait que le format JSON utilise "" (Citations) et que tout ce qui est entre ces citations est une information utile (clé ou données).

Supposons que vos données soient: He said "This is how it is done". Les données réelles devraient alors ressembler à "He said \"This is how it is done\"."

Cela garantit que le \" est traité en tant que "(Quotation mark) et non en tant que formatage JSON. Ceci s'appelle escape character.

Cela se produit généralement lorsque l'on essaie de coder des données déjà codées en JSON, ce qui est une façon courante de voir cela se produire.

Essaye ça

$arr = ['This is a sample','This is also a "sample"']; echo json_encode($arr);

SORTIE:

["This is a sample","This is also a \"sample\""]
2
Mayank

J'ai eu un problème très similaire, j'avais un tableau prêt à être posté. Dans ma fonction de poste, j'avais ceci:

json = JSON.stringfy(json);

le détail, c’est que j’utilise blade dans laravel pour créer un formulaire à trois vues, ce qui me permet de revenir en arrière, j’ai entre les validations des boutons précédent et suivant et lorsque je retourne au formulaire sans recharger la page JSON se remplir par des barres obliques inverses. Je console.log(json) dans chaque validation et a réalisé que le JSON a été traité comme une chaîne au lieu d'un objet. 

En conclusion, je n'aurais pas dû assigner json = JSON.stringfy(json) à la place, je l'ai affecté à une autre variable. 

var aux = JSON.stringfy(json);

De cette façon, je garde JSON en tant qu'objet et non en tant que chaîne.

0
Jesus Walker