javascript - Hur man undviker en JSON-sträng för att ha den i en URL?


Med Javascript vill jag generera en länk till en sida. Parametrarna till sidan finns i en Javascript-array som jag serialiserar i JSON.

Så jag skulle vilja generera en URL som den här:

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

Hur behöver jag escapea min JSON-sträng (seriealiserad array) för att inkludera den som en parameter i en URL?

Om det finns en lösning med JQuery skulle jag älska det.

Obs: Ja, parametrarna till sidan måste vara i en array eftersom det finns många av dem. Jag tror att jag kommer att använda bit.ly för att förkorta länkarna efteråt.

Svar #1

encodeURIComponent(JSON.stringify(object_to_be_serialised))

Svar #2

Jag letade efter att göra samma sak. Problemet för mig var att min URL blev alldeles för lång. Jag hittade en lösning idag med Bruno Jouhiers jsUrl.js-bibliotek.

Jag har inte testat det särskilt noggrant än. Här är dock ett exempel som visar teckenlängderna på strängutgången efter att ha kodats samma stora objekt med 3 olika metoder:

  • 2651 tecken med jQuery.param
  • 1691 tecken med JSON.stringify + encodeURIComponent
  • 821 tecken med JSURL.stringify

klart har JSURL det mest optimerade formatet för urlEncoding av ett js-objekt.

tråden på https://groups.google.com/forum/?fromgroups=#!topic/nodejs/ivdZuGCF86Q visar prestandamätningar för kodning och analys.

Notera: Efter testning verkar det som att jsurl.js-biblioteket använder ECMAScript 5-funktioner såsom Object.keys, Array.map och Array.filter. Därför kommer det endast att fungera i moderna webbläsare (ingen IE 8 och tidigare). Det finns dock polyfills för dessa funktioner som skulle göra det kompatibelt med fler webbläsare.

  • för array: https://stackoverflow.com/a/2790686/467286
  • för object.keys: https://stackoverflow.com/a/3937321/467286

Svar #3

Du kan använda encodeURIComponent för att säkert URL-koda delar av en frågesträng:

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

eller om du skickar detta som en AJAX-förfrågan:

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

Svar #4

Jag kommer att erbjuda ett alternativ. Ibland är det lättare att använda en helt annan kodning, särskilt om du hanterar olika system som inte alla hanterar detaljerna för URL-kodning på samma sätt.

Istället för att URL-koda datan kan du base64-koda den. Fördelen med detta är att den kodade datan är mycket generell, bestående endast av alfabetiska tecken och ibland avslutande =-tecken. Exempel:

JSON-array av strängar:

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

De uppgifterna, URL-kodade som data-parametern:

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

Samma, base64-kodat:

"data=WyJvcHRpb24iLCAiRnJlZCdzIGRvZyIsICJCaWxsICYgVHJ1ZHkiLCAicGFyYW09MyJd"

Base64-metoden kan vara något kortare, men ännu viktigare är att den är enklare. Jag har ofta problem med att flytta URL-kodad data mellan cURL, webbläsare och andra klienter, vanligtvis på grund av citattecken, inbäddade %-tecken, skalutvidgning av jokertecken och så vidare. Base64 är mycket neutralt och mycket portabelt eftersom det inte finns några specialtecken i dess output.

Många system använder detta tillvägagångssätt. Till exempel i Kubernetes-ekosystemet representerar kubectl edit secret alla hemligheter i base64 för att undvika kodningsproblem och för att göra icke-utskrivbara binära data enkla att kopiera och klistra in.

Svar #5

Använder encodeURIComponent():

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

Relaterade artiklar