2011-10-31 6 views
2

Je sais que cela a été demandé à quelques reprises, mais s'il vous plaît ours avec moi.convertir objet JSON à la chaîne de requête, puis de nouveau à un objet

J'ai un objet google maps qui est plutôt complexe (il contient divers nœuds, coordonnées, etc) et j'essaye de le passer comme une chaîne de requête.

J'ai besoin d'une solution play javascript/jQuery.

J'ai essayé la méthode .param qui donne une erreur jQuery. La seule chose qui fonctionne est la méthode "stringify" qui crée ensuite une chaîne qui, lorsqu'elle apparaît sous forme d'URL, ressemble à ceci:% 7B% 5C "shape_1% 5C"% 3A% 7B% 5C "couleur% 5C"% 3A % 5C "% 237F0000% 5C"% 2C% 5C "données% 5C"% 3A% 7B% 5C "b% 5C"% 3A% 5B% 7B% 5C "Na% 5C"% 3A51.56727431757122% 2C% 5C " Oa% 5C "% 3A-0,10462402858888709% 7D% 2C ....

php traduit que: {\\" \\ shape_1 ": {\\" couleur \\ ": \\" # 7f0000 \ \ ", \\" données \\ ": {\\" b \\ ": [{\\" Na \\ ": 51.56727431757122, \\" Oa \\ ": - 0.10462402858888709}, ...

mais ayant dit que je ne veux pas utiliser PHP, je vous montre juste ce qu'il fait au cas où il vous aiderait à voir ce que stringify a fait à l'objet.

Après échappement d'avec Javascript il semble un peu plus normal comme:

{\ "shape_1 \": {\ "color \": \ "# 7f0000 \", \ "data \": {\ "b \": [{\ "Na \": 51.56727431757122, \ "Oa \": - 0.10462402858888709}, ..

Ainsi que vous pouvez le voir, la séquence non échappée a ces barres partout. Lorsque j'essaie d'évaluer cela dans un objet JSON, j'obtiens un "jeton Illégal". La méthode d'analyse échoue également. Je ne trouve aucun moyen de remettre cette chaîne dans l'objet JSON complexe qu'elle était. J'ai regardé en ligne pour diverses suggestions, mais ils échouent. Je ne comprends pas non plus pourquoi stringify injecte toutes ces barres obliques qui ne devraient tout simplement pas être là. Si quelqu'un a une idée sur la façon de prendre cet objet, placez-le dans une chaîne de requête, puis répétez-le, je vous serais très reconnaissant.

Nick


Mise à jour: La réponse est la suivante:

encodeURIComponent(JSON.stringify(myObject)); 

Et puis sur la réception:

var a = querySt("data"); 
var b = decodeURIComponent(a); 
var c = unescape(b); 
var d = JSON.parse(c); 

ou en une seule ligne

JSON.parse(unescape(decodeURIComponent(querySt("data")))); 

Nick

+0

J'éviterais d'essayer de mettre JSON dans les chaînes de requête si cela est possible. Avec une quantité modeste de données, vous pouvez assez facilement rencontrer des limites de longueur. –

+0

Pouvez-vous peut-être penser à un moyen de transmettre ces coordonnées d'un formulaire à un e-mail et de l'e-mail à une autre page html? – Nick

+0

Que voulez-vous dire en passant des coordonnées d'un formulaire à un courriel? Voulez-vous envoyer un e-mail contenant les coordonnées? Et puis envoyer un autre courriel qui crée une page HTML? –

Répondre

0

Voir http://php.net/manual/de/security.magicquotes.php - vous devez désactiver les guillemets magiques. Ils sont vieux, obsolètes, ils ne sont pas sûrs et brisent des trucs.

Magic Quotes is a process that automagically escapes incoming data to the PHP script. It's preferred to code with magic quotes off and to instead escape the data at runtime, as needed.

Howto: http://www.php.net/manual/de/security.magicquotes.disabling.php

+0

Ah oui, mais j'ai besoin d'une solution non PHP. Idéalement, la chaîne JSON devrait être encodée et décodée en utilisant jQuery. Y at-il une solution pour cela? Et pourquoi la méthode "stringify" de jQuery ajoute-t-elle des guillemets magiques? Je n'utilise PHP pour aucune partie du processus – Nick

+0

@Nick: Hmm, quoi? Vous avez écrit "mais php traduit cela comme". – thejh

+0

Oui c'est ce que PHP fait mais je ne l'utilise pas. Idéalement, je veux utiliser html plain – Nick

0

Essayez ceci pour convertir la chaîne de requête en objet JSON

var queryStringToJSON = function (url) { 
    if (url === '') 
     return ''; 
    var pairs = (url || location.search).slice(1).split('&'); 
    var result = {}; 
    for (var idx in pairs) { 
    var pair = pairs[idx].split('='); 
    if (!!pair[0]) 
     result[pair[0].toLowerCase()] = decodeURIComponent(pair[1] || ''); 
    } 
    return result; 
} 

Vous pouvez utiliser jQuery.param méthode pour recopier l'objet json à la chaîne de requête

Questions connexes