将查询字符串反序列化为JSON对象

时间:2012-07-19 09:10:31

标签: javascript jquery underscore.js

试图找到如何从{foo:"bar"}制作?...&foo=bar&...但是用谷歌搜索,只得到jQuery.params,这恰恰相反。任何建议请(内置的javascript函数, jquery underscore.js - 一切顺利)?或者,我是否需要自己实施(不是很麻烦,只是试图不重新发明轮子)?

7 个答案:

答案 0 :(得分:7)

我在这里发布我的函数以防万一其他会看起来并希望直接得到它不需要jquery本机JS。因为我一直在寻找同样的东西,并在看完其他答案后终于完成了这个功能:

function queryStringToJSON(queryString) {
  if(queryString.indexOf('?') > -1){
    queryString = queryString.split('?')[1];
  }
  var pairs = queryString.split('&');
  var result = {};
  pairs.forEach(function(pair) {
    pair = pair.split('=');
    result[pair[0]] = decodeURIComponent(pair[1] || '');
  });
  return result;
}


console.log(queryStringToJSON(window.location.href)); 
console.log(queryStringToJSON('test=1&check=wow'));//Object {test: "1", check: "wow"}

答案 1 :(得分:7)

实际上@talsibony的上述答案没有考虑查询字符串数组(例如test=1&test=2&test=3&check=wow&such=doge)。这是我的实施:

function queryStringToJSON(qs) {
    qs = qs || location.search.slice(1);

    var pairs = qs.split('&');
    var result = {};
    pairs.forEach(function(p) {
        var pair = p.split('=');
        var key = pair[0];
        var value = decodeURIComponent(pair[1] || '');

        if( result[key] ) {
            if( Object.prototype.toString.call( result[key] ) === '[object Array]' ) {
                result[key].push( value );
            } else {
                result[key] = [ result[key], value ];
            }
        } else {
            result[key] = value;
        }
    });

    return JSON.parse(JSON.stringify(result));
};

答案 2 :(得分:5)

你有Ben Alman的jQuery BBQjQuery.deparam。它被描述为The opposite of jQuery.param, pretty much.

http://benalman.com/code/projects/jquery-bbq/examples/deparam/

第一个例子正是你所需要的。

答案 3 :(得分:4)

在现代浏览器中,您还可以使用Object.fromEntries,这使此操作更加容易。

function queryStringToObject(queryString) {
  const pairs = queryString.substring(1).split('&');
  // → ["foo=bar", "baz=buzz"]

  var array = pairs.map((el) => {
    const parts = el.split('=');
    return parts;
  });
  // → [["foo", "bar"], ["baz", "buzz"]]

  return Object.fromEntries(array);
  // → { "foo": "bar", "baz": "buzz" }
}

console.log(queryStringToObject('?foo=bar&baz=buzz'));


URLSearchParams interface可以与浏览器URL搜索参数进行交互。 浏览器对URLSearchParams的支持相当不错。

您的情况是:

console.log(
  Object.fromEntries(new URLSearchParams('foo=bar&baz=buzz'))
);

答案 4 :(得分:1)

对于简单和扁平的查询字符串,类似这样的东西就可以了解

const queryStringToObject = (queryString) => {
  let obj = {}
  if(queryString) {
    queryString.slice(1).split('&').map((item) => {
      const [ k, v ] = item.split('=')
      v ? obj[k] = v : null
    })
  }
  return obj
}

答案 5 :(得分:0)

URLSearchParams()构造函数创建并返回一个新的URLSearchParams对象。

var url = new URL('https://example.com?foo=1&bar=2'); 
var params = new URLSearchParams(url.search);

https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams/URLSearchParams

答案 6 :(得分:0)

我知道这个线程有点旧-但这对我有用-希望它也会对其他人有所帮助..

var _searchModel = yourquerystring.split("&");
for (var x = 0; x < _searchModel.length; x++) {
  //break each set into key and value pair
  var _kv = _searchModel[x].split("=");

  //console.log(_kv);

  var _fieldID = _kv[0];
  var _fieldVal = _kv[1];
}