Come sfuggire a una stringa JSON per averla in un URL?


129

Utilizzando Javascript, desidero generare un collegamento a una pagina. I parametri della pagina sono in un array Javascript che serializzo in JSON.

Quindi vorrei generare un URL del genere:

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

Come devo evitare la mia stringa JSON (array serializzato) per includerla come parametro in un URL?

Se c'è una soluzione che utilizza JQuery, mi piacerebbe.

Nota: Sì, i parametri della pagina devono essere in un array perché ce ne sono molti. Penso che userò bit.ly per abbreviare i collegamenti in seguito.


Risposte:


210
encodeURIComponent(JSON.stringify(object_to_be_serialised))

10
Sembra però che codifichi più caratteri del necessario (quando incollo il link in Firefox, alcuni caratteri vengono ripristinati (ovvero {["). Esiste un modo per codificare solo i caratteri necessari, in modo da poter accorciare i miei URL?
Matthieu Napoli

19

È possibile utilizzare l' encodeURIComponentURL sicuro per codificare parti di una stringa di query:

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

o se lo stai inviando come richiesta AJAX:

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

19

Stavo cercando di fare la stessa cosa. il problema per me era che il mio URL stava diventando troppo lungo. Oggi ho trovato una soluzione usando la libreria jsUrl.js di Bruno Jouhier .

Non l'ho ancora testato molto accuratamente. Tuttavia, ecco un esempio che mostra la lunghezza dei caratteri dell'output della stringa dopo aver codificato lo stesso oggetto di grandi dimensioni utilizzando 3 metodi diversi:

  • 2651 caratteri usando jQuery.param
  • 1691 caratteri usando JSON.stringify + encodeURIComponent
  • 821 caratteri usando JSURL.stringify

chiaramente JSURL ha il formato più ottimizzato per urlEncoding di un oggetto js.

la discussione su https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q mostra parametri di riferimento per la codifica e l'analisi.

Nota : dopo il test, sembra che la libreria jsurl.js utilizzi le funzioni ECMAScript 5 come Object.keys, Array.map e Array.filter. Pertanto, funzionerà solo su browser moderni (no, cioè 8 e meno). Tuttavia, sono polifillamenti per queste funzioni che lo renderebbero compatibile con più browser.


Da 0.1.4 è anche compatibile con IE 6-8 se ne hai ancora bisogno.
Stoffe,

8

Utilizzando encodeURIComponent():

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

5

Offrirò un'alternativa strana. A volte è più facile usare codifiche diverse, specialmente se hai a che fare con una varietà di sistemi che non gestiscono tutti i dettagli della codifica URL allo stesso modo. Questo non è l'approccio più mainstream ma può tornare utile in determinate situazioni.

Invece di codificare i dati tramite URL, è possibile codificarli in base64. Il vantaggio di ciò è che i dati codificati sono molto generici, costituiti solo da caratteri alfa e talvolta da quelli finali =. Esempio:

Matrice di stringhe JSON:

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

Tali dati, codificati nell'URL come dataparametro:

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

Stesso, codificato base64:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

L'approccio base64 può essere un po 'più breve, ma soprattutto è più semplice. Ho spesso problemi a spostare i dati con codifica URL tra cURL, browser Web e altri client, di solito a causa di virgolette, %segni incorporati e così via. Base64 è molto neutro perché non usa caratteri speciali.


finalmente trovato l'indirizzo (% 26) del mio amico (&) qui
Pradeep Kumar Prabaharan,

problema con stringhe base64 è che possono contenere il carattere barra (/), che invaliderebbe url ...
ingbabic

È vero, ma puoi scegliere i caratteri da utilizzare in base64: sostituisci /con $, _o qualsiasi altro personaggio che non richiede la codifica dell'URL secondo RFC 3986.
Chris Johnson,

0

La risposta data da Delan è perfetta. Basta aggiungerlo - se qualcuno vuole nominare i parametri o passare più stringhe JSON separatamente - il codice qui sotto potrebbe aiutare!

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')));

Spero che questo ti aiuti!


Non è necessario urldecode () i dati che arrivano in PHP $ _POST o qualsiasi altro (GET, REQEST, ecc.). A seconda di ciò che fai da qui in poi, potresti aprirti per un problema di sicurezza (iniezione SQL, ecc.)
Tit Petric,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.