2013-07-05 25 views
11

Nie mogę znaleźć odpowiedzi na to pytanie .. Jak mogę przekonwertować ciąg parametrów adresu URL na JSON w javascript? Chodzi mi o to, żeby zapytać, czy istnieje wbudowana funkcja taka jak ta, czy też jedna liniówka, która mogłaby wykonać to zadanie?Konwertuj adres URL na json

przykład:

some=params&over=here =>{"some":"params","over":"here"}

+0

używasz jquery? jeśli tak, spróbuj Jeśli używasz jQuery, JSON.parse (this.yourURLString); lub jQuery.parseJSON (this.yourURLString); – Satya

+2

[Ta odpowiedź] (http://stackoverflow.com/a/2880929/502381) zwraca rodzaj obiektu, który chcesz. – JJJ

+0

Czy pytasz o czysty ciąg znaków, aby napisać tutaj problem konwersji? A może używasz serwera JavaScript, takiego jak node.js, i masz parametry, które chcesz przekształcić w obiekt, a następnie, prawdopodobnie, w JSON? –

Odpowiedz

20

Spróbuj

var params = getUrlVars('some=params&over=here'); 
console.log(params); 

function getUrlVars(url) { 
    var hash; 
    var myJson = {}; 
    var hashes = url.slice(url.indexOf('?') + 1).split('&'); 
    for (var i = 0; i < hashes.length; i++) { 
     hash = hashes[i].split('='); 
     myJson[hash[0]] = hash[1]; 
    } 
    return myJson; 
} 

Demo: http://jsfiddle.net/jAGN5/

+0

Prosiłem o jeden liniowiec, ale dzięki za funkcję iway, + rep ':)' –

+1

Nie otrzyma wszystkich wartości tego samego parametru. Na przykład, jeśli URL był "some = params & over = here & over = there", nie zwróciłby listy dla parametru "over". – fixxxer

+0

konwertuje "isParam = true" na {isParam: 'true'} –

1

Spróbuj zastosowanie tej funkcji:

// Returns an object with elements "name: value" with data ftom URL (the "name=value" pairs) 
function getDataUrl(url) { 
// From: http://coursesweb.net/javascript/ 
    var url_data = url.match(/\?([^#]*)/i)[1];   // gets the string between '?' and '#' 

    // separate the data into an array, in case the are multiple pairs name=value 
    var ar_url_data = url_data.split('&'); 

    // traverse the array, and adds into an object elements name:value 
    var data_url = {}; 
    for(var i=0; i<ar_url_data.length; i++) { 
    var ar_val = ar_url_data[i].split('=');   // separate name and value from each pair 
    data_url[ar_val[0]] = ar_val[1]; 
    } 

    return data_url; 
} 
2

Jeśli jest to jedno-liner jesteś po biblioteka Podkreślenie ma ładną funkcję o nazwie object, która przyjmuje tablicę par i buduje obiekt z nim:

> _.object(["some","param"],["over","here"]) 
{some: "param", over: "here"} 

Jeśli używasz podkreślenia ty może jeden-line budowę obiektu z łańcucha zapytania następująco:

> var s = 'some=param&over=here'; 
> _.object(s.split('&').map(function(p){return p.split('=');})) 
{some: "param", over: "here"} 

teraz, jeśli chcesz to obiekt JavaScript, gotowe. Mówiłeś, że w swoim pytaniu, że chciałeś JSON, więc następnym krokiem jest całkiem proste:

> JSON.stringify(_.object(s.split('&').map(function(p){return p.split('=');}))) 
"{\"some\": \"param\", \"over\": \"here\"}" 

Oto live demo

Jeśli nie używasz podkreślenia zawsze można napisać funkcję użytkową Twój własny.

Ta jedna linia jest trochę brzydka, ale Firefox 22 ma niektóre z nadchodzących funkcji ES6, takich jak tablice i strzały, dzięki czemu kod może stać się jeszcze bardziej kompaktowy w przyszłości, np.

JSON.stringify(_.object(s.split('&').map(p => p.split('=')))) 

lub nawet

JSON.stringify(_.object([p.split('=') for (p of s.split('&'))])) 

A może po prostu trzymać się czytelny dla pętli i stworzyć własną funkcję. :)

1

Spróbuj tego:

var str = 'some1=param&some2=param2'; 

JSON.parse('{"' + decodeURI(str).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"').replace(/\s/g,'') + '"}') 

// {some1: "param1", some2: "param2"} 
0

użyłem satpal „s answer zapewnić miłą ostrzami JSON rurociągu, który współpracuje z Html.BeginForm, @Html.TextBoxFor itp

Zaktualizowana funkcja getUrlVars wygląda następująco:

function getUrlVars(url) { 
    var hash; 
    var myJson = {}; 
    var hashes = url.slice(url.indexOf('?') + 1).split('&'); 
    for (var i = 0; i < hashes.length; i++) { 
     hash = hashes[i].split('='); 
     var value = decodeURIComponent(hash[1]); 
     value = value.replace("[\"", ""); 
     value = value.replace("\"]", ""); 
     value = value.replace(/\^.*/, ""); 
     myJson[hash[0]] = value; 
    } 
    return myJson; 
} 

Dodatkowe wywołania replace są dla znaków, które dostaję w moich polach tekstowych, prawdopodobnie za pomocą rozwijanych odsyłaczy magicSuggest. Wywołanie decodeURIComponent oczyszcza je z%.

nazywam go w bloku tak:

var serialized = $("#saveForm").serialize(); 
    var params = getUrlVars(serialized); 

maszynki składnia mam wygląda następująco:

@using (Html.BeginForm("SaveNewAddress", "Internal", FormMethod.Post, new { @Id = "saveForm" })) 
{ 
    @Html.ValidationSummary() 

    <table style="width: 100%; margin: 0 auto; padding: 10px"> 

     <tr> 
      <td colspan="2"> 
       <label>Is this a Liliputian Address?</label> 
      </td> 
      <td colspan="4" style="font-size: 1.1em"> 

       <div style="float: left; margin-left: 10px"> 
        <label class="label_check"> 
         @Html.RadioButton("IsLiliputian", "Yes", true, new { @id = "IsLiliputianYes", @style = "width:30px" }) 
        </label> 
        Yes 
       </div> 
       ...etc 

Zapewnia to dobry sposób, aby uzyskać kilka danych tworzonych i za pośrednictwem kontrolek ASP.Net MVC w obiekcie js, który mogę wyrzucić w usłudze internetowej za pośrednictwem ajax.