Подтвердить что ты не робот

Конвертировать URL в json

Я не могу найти ответ на этот вопрос. Как преобразовать строку параметров URL в JSON в javascript? Я хочу спросить, есть ли встроенная функция вроде этого или однострочный, который мог бы выполнить эту работу?

Пример:

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

4b9b3361

Ответ 1

Попробуйте это

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;
}

Демо: http://jsfiddle.net/jAGN5/

Ответ 2

Если это один лайнер, который вы используете, библиотека Underscore имеет симпатичную функцию под названием object, которая берет массив пар и строит из него объект:

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

Если вы используете Underscore, вы можете однострочно построить объект из строки запроса следующим образом:

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

Теперь, если все, что вы хотите, это объект JavaScript, все готово. Вы сказали в своем вопросе, что хотите JSON, поэтому следующий шаг довольно прост:

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

Вот живая демонстрация

Если вы не используете Underscore, вы всегда можете написать собственную служебную функцию.

Эта одна строка немного уродливая, но в Firefox 22 есть некоторые из предстоящих функций ES6, таких как массивы и стрелки, поэтому в будущем код может быть еще более компактным, например.

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

или даже

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

Или, может быть, просто придерживайтесь читаемых циклов и создавайте свою собственную функцию.:)

Ответ 3

Попробуйте использовать эту функцию:

// 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;
}

Ответ 4

Попробуйте следующее:

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

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

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

Ответ 5

Я использовал satpal ответ, чтобы обеспечить хороший конвейер Razor для JSON, который работает с Html.BeginForm, @Html.TextBoxFor и т.д.

Обновленная функция getUrlVars выглядит следующим образом:

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;
}

Дополнительные вызовы replace предназначены для символов, которые я получаю в своих текстовых полях, возможно, с помощью выпадающего поиска magicSuggest. Вызов decodeURIComponent сначала очищает его от%.

Я называю это в блоке следующим образом:

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

Синтаксис Razor выглядит следующим образом:

@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

Это обеспечивает хороший способ получить кучу данных, созданных в и через ASP.Net MVC-элементы управления в объекте js, который я могу использовать для веб-службы через ajax.