web-dev-qa-db-fra.com

Comment insérer des guillemets dans une chaîne d'une réponse ajax JSON de php?

Je reçois une réponse JSON dans une requête Ajax du serveur. De cette façon ça marche:

{"a": "1", "b": "bonjour 'minou'"} 

Mais je n’ai pas réussi à mettre des guillemets doubles autour de minou .

Lorsque je convertis "en\x22 dans la réponse Ajax, il est toujours interprété comme" par JavaScript et je ne peux pas analyser le JSON.

Dois-je également échapper à la\et à l'évasion plus tard (ce qui serait possible)?

Comment faire ça?

Edit: Je ne sais pas si je l'ai bien exprimé: je veux cette chaîne à l'intérieur de "b" après l'analyse:

hello Kitty"

Si nécessaire, je pourrais aussi ajouter une étape supplémentaire après l'analyse pour convertir "b", mais je suppose que ce n'est pas nécessaire, il existe un moyen plus élégant, ce qui se produit automatiquement?

Edit2: La page ajax est générée par php. J'ai essayé plusieurs choses maintenant pour créer la valeur de b, toutes résultent en une erreur d'analyse JSON sur la page:

  $b = 'hello "kitty"';      

  // no 1:
  //$b = str_replace('"',"\x22",$b);

  // or no 2:
  // $b = addslashes($b);  

  // or no 3: 
  $b = str_replace('"','\"',$b);

  echo '{ "a" : "1", "b" : "' . $b . '"}';

Edit3: Cette solution fonctionne enfin:

$b = 'hello "kitty"';      
$b = str_replace('"','\\"',$b); 
echo '{ "a" : "1", "b" : "' . $b . '"}';
40
user89021

Il suffit d’échapper avec une barre oblique inverse:

> JSON.stringify({"a": 5, "b": 'a "kitty" mighty odd'})
{"a":5,"b":"a \"kitty\" mighty odd"}
> JSON.parse('{"a":5,"b":"a \\"kitty\\" mighty odd"}')
Object
  a: 5
  b: a "kitty" mighty odd
  __proto__: Object

Les analyseurs JSON reconnaissent \" à l'intérieur des chaînes entre guillemets doubles. Notez que dans le deuxième exemple, la double barre oblique inversée est nécessaire car il existe une passe d'analyse Javascript, puis une autre passe d'analyse JSON.

56
Max Shawabkeh

utilisez seulement json_encode (n'importe quel élément PHP), il sera automatiquement analysé.

2
mahesh

Un peu hors sujet, vous pourriez utiliser JavaScript/NodeJS sur votre serveur et utiliser les littéraux de modèle ES6 (les backticks "utilisés autour de" Christian "), mais 7 ans plus tard, vous utilisez probablement déjà NodeJS :) 

var myJSON = {
    "name": {
        "first": `"Christian"`,
        "last": "Broberg"
    },
    "age": 49,
    "skills": [ "JavaScript", "React", "NodeJS" ],
    "married": false,
    "superpowers": null
}
0
Christian Broberg