2012-05-02 6 views
0

J'essaye de construire une chaîne dans JS qui peut être passée dans JSON avec un format très particulier. résultat souhaité est une chaîne de la forme suivante:Comment échapper les guillemets entre JS et JSON

[ "PNG", "350x150", "127 KB"]

PNG correspondent au type d'une image particulière, où 350x150 est l'image de dimensions et où 127 KB est la taille de l'image. Chacune de ces valeurs threee sont des variables de chaîne:

var imgType = getImageType(); // Returns "PNG" 
var imgDim = getImageDim(); // Returns "350x150" 
var imgSize = getImageSize(); // Returns "127 KB" 

var imgDescription = '["' + imgType + '","' + imgDim + '","' + imgSize + '"]'; 

// Sanity check 
alert(imgDescription); 

iVO.images[thisImage] = { 
    "fizz":"buzz", 
    "imgDesc":imgDescription, 
    "foo":"bar" 
} 

alert(JSON.stringify(iVO)); 

La première alerte (sur la variable imgDescription) imprime:

[ "PNG", "350x150", "127 KB"]

Jusqu'ici, tout va bien. Cependant, la minute où nous passons à la iVO construction et stringify la JSON résultante, il génère la sortie suivante (après avoir assez format l'imprimer):

{ 
    "images": 
    { 
     "4490i45"": 
     { 
      "fizz":"buzz", 
      "imgDesc":"[\"PNG\",\"350x150\",\"127 KB\"]", 
      "foo":"bar" 
     } 
    } 
} 

Tous mes guillemets doubles (") ont été échappées (\ ") !!! En outre, la valeur pour imgDesc est entre guillemets, ce qui n'est pas ce que nous voulons (voir le JSON souhaité ci-dessous):

Lorsque je renvoie ce JSON au serveur, le serveur se bloque.

Je ne sais pas ce qui se passe ici, mais j'ai essayé plusieurs autres suggestions, y compris le remplacement de mes guillemets avec '\x22' instances qui n'a pas aidé.

Des idées sur ce qui permettrait de résoudre ce problème pour obtenir le résultat souhaité de JSON.stringify(iVO)? En fin de compte, c'est la seule chose qui compte, que l'on finit par envoyer les documents suivants au serveur:

{ 
    "images": 
    { 
     "4490i45"": 
     { 
      "fizz":"buzz", 
      "imgDesc":["PNG","350x150","127 KB"], 
      "foo":"bar" 
     } 
    } 
} 

Pas échappèrent guillemets doubles, et n'est pas entre guillemets la valeur pour imgDesc. Merci d'avance!

+0

Avez-vous essayé d'ajouter des citations supplémentaires se sont échappés? – dweiss

+0

Cela ressemble à une suggestion décente @dweiss - une chance de fournir un exemple de code? Merci encore! – IAmYourFaja

+0

Votre cible n'est pas valide JSON ("imgDesc": ["PNG", "350x150", "127 KB"], etc.). – Will

Répondre

6

Pourquoi ne pas vous venez de mettre imgDescription comme réseau régulier

var imgDescription = [imgType , imgDim, imgSize]; 

stringify devrait prendre soin de ce que vous essayez de faire, sinon vous passez imgDescription comme une chaîne et stringify échapperaient les citations.

par exemple.

var imgType = "PNG"; 
var imgDim = "350x150"; 
var imgSize = "127 KB"; 
var d = { 
    "fizz":"buzz", 
    "imgDesc":[imgType , imgDim, imgSize], 
    "foo":"bar" 
} 
console.log(JSON.stringify(d)); 

Sortie:

{"fizz":"buzz","imgDesc":["PNG","350x150","127 KB"],"foo":"bar"} 
+1

+1 Juste sur le point d'ajouter la même réponse;). Vous êtes en train d'enchaîner une chaîne, donc bien sûr, il l'échappe. Si vous enchaînez un * objet *, vous obtiendrez un JSON parfaitement formaté. –

+0

Indubitablement !!!! – IAmYourFaja

+0

Le fait est que JSON.stringify retourne réellement une chaîne entre guillemets SINGLE. la chaîne est en fait '{"fizz": "buzz", ...' et dès que vous mettez cette chaîne dans une double chaîne encodée, il y a des problèmes. – tmarthal

Questions connexes