2011-07-24 2 views
103

En utilisant Javascript, je veux générer un lien vers une page. Les paramètres de la page sont dans un tableau Javascript que je sérialise dans JSON.Comment faire pour échapper une chaîne JSON pour l'avoir dans une URL?

Je voudrais générer une URL comme ça:

http://example.com/?data="MY_JSON_ARRAY_HERE" 

Comment dois-je échapper à ma chaîne JSON (tableau sérialisé) pour l'inclure comme paramètre dans une URL?

S'il existe une solution utilisant JQuery, je l'adorerais.

Remarque: Oui, les paramètres de la page doivent être dans un tableau car ils sont nombreux. Je pense que je vais utiliser bit.ly pour raccourcir les liens après.

+0

Voir aussi http://stackoverflow.com/questions/21802866/how-to-compress-url-parameters – w00t

Répondre

174
encodeURIComponent(JSON.stringify(object_to_be_serialised)) 
+5

Il semble cependant qu'il code plus de caractères que nécessaire (lorsque je colle le lien dans Firefox, certains caractères sont inversés back (ie '{[" '.) Est-il possible de coder uniquement les caractères nécessaires pour raccourcir mes URL? –

5

En utilisant encodeURIComponent():

var url = 'index.php?data='+encodeURIComponent(JSON.stringify({"json":[{"j":"son"}]})), 
17

Vous pouvez utiliser les encodeURIComponent en toute sécurité les pièces encodent URL d'une chaîne de requête:

var array = JSON.stringify([ 'foo', 'bar' ]); 
var url = 'http://example.com/?data=' + encodeURIComponent(array); 

ou si vous envoyez cela comme une requête AJAX :

var array = JSON.stringify([ 'foo', 'bar' ]); 
$.ajax({ 
    url: 'http://example.com/', 
    type: 'GET', 
    data: { data: array }, 
    success: function(result) { 
     // process the results 
    } 
}); 
0

Réponse donnée par Delan est parfait. Il suffit d'ajouter à cela - quelqu'un veut nommer les paramètres ou passer plusieurs chaînes JSON séparément - le code ci-dessous pourrait aider!

JQuery

var valuesToPass = new Array(encodeURIComponent(VALUE_1), encodeURIComponent(VALUE_2), encodeURIComponent(VALUE_3), encodeURIComponent(VALUE_4)); 

data = {elements:JSON.stringify(valuesToPass)} 

PHP

json_decode(urldecode($_POST('elements'))); 

Hope this helps!

+0

Il n'y a pas besoin de données urldecode() qui viennent en PHP $ _POST ou tout autre (GET, REQEST, etc.) En fonction de ce que vous faites à partir de maintenant, vous pourriez vous ouvrir pour un problème de sécurité (injection SQL, etc.) –

13

Je cherchais à faire la même chose. problème pour moi était mon url devenait trop long. J'ai trouvé une solution aujourd'hui en utilisant Bruno Jouhier's jsUrl.js library.

Je ne l'ai pas encore testé très minutieusement. Cependant, voici un exemple montrant les longueurs de caractères de la sortie de la chaîne après codant pour le même objet de grande taille en utilisant 3 méthodes différentes:

  • 2651 caractères en utilisant des caractères jQuery.param
  • 1691 en utilisant JSON.stringify + encodeURIComponent
  • 821 caractères en utilisant JSURL.stringify

clairement JSURL a le format le plus optimisé pour urlEncoding un objet js.

le fil à https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q montre des repères pour le codage et l'analyse. Après avoir testé, il semble que la bibliothèque jsurl.js utilise des fonctions ECMAScript 5 telles que Object.keys, Array.map et Array.filter.Par conséquent, il ne fonctionnera que sur les navigateurs modernes (non, c'est à dire 8 et moins). Cependant, sont polyfills pour ces fonctions qui le rendraient compatible avec plus de navigateurs.

+0

Depuis 0.1.4, il est également compatible avec IE 6-8 si vous en avez encore besoin. – Stoffe

2

Je vais proposer une alternative hurluberlu. Parfois, il est plus facile d'utiliser un encodage différent, surtout si vous avez affaire à divers systèmes qui ne traitent pas tous les détails de l'encodage d'URL de la même manière. Ce n'est pas l'approche la plus courante, mais peut être utile dans certaines situations. Plutôt que d'encoder les données, vous pouvez encoder en base 64. L'avantage de ceci est que les données codées sont très génériques, composées seulement de caractères alpha et parfois de =. Exemple:

JSON tableau-de-cordes:

["option", "Fred's dog", "Bill & Trudy", "param=3"] 

Ces données, URL codées comme data param:

"data=%5B%27option%27%2C+%22Fred%27s+dog%22%2C+%27Bill+%26+Trudy%27%2C+%27param%3D3%27%5D" 

même, base64:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd" 

L'approche base64 peut être un peu plus courte, mais plus important encore, c'est plus simple. J'ai souvent des problèmes à déplacer des données codées en URL entre cURL, les navigateurs Web et d'autres clients, généralement en raison de citations, des signes % intégrés et ainsi de suite. Base64 est très neutre car il n'utilise pas de caractères spéciaux.

Questions connexes