从查询字符串参数中推断出正确的数据类型

时间:2016-05-18 21:18:44

标签: javascript json

我想从查询字符串的参数推断出类型(使用Javascript)。

示例网址:

http://example.com/some/path/here/?someString=Hey&someNumber=20

我已经使用了几个包(query-stringsimple-query-string),如下所示:

queryString.parse(request.url)

request.url是上面的网址。这给出了以下内容:

{
    "someString":"Hey",
    "someNumber":"20"
}

上面的someNumber类型为string。期望的结果是:

{
    "someString":"Hey",
    "someNumber":20
}

someNumber的类型为integer

我想要integer类型的原因是因为我正在对参数执行JSONSchema验证,这些参数指定了每个命名参数允许的类型。

我知道我可以投射这些实例,但我更喜欢它是否可以从包中获得,因为它感觉就像重新发明轮子一样。

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题。您可以添加更多/不同的正则表达式测试,以补充现在的简单数字检查(例如,检测日期,美元金额,电话号码等)。

var exampleurl = "http://example.com/some/path/here/?someString=Hey&someNumber=20"

function getQueryStringData(url){
  var data = url.split('?')[1].split('&'),
    numberRgx = /^\d+(\.\d+)?$/
  
  return data.reduce(function(obj, t){
    var pair = t.split('='),
        key = pair[0],
        val = pair[1]
    
    obj[key] = numberRgx.test(val) ? parseFloat(val) : val
    return obj
  }, {})
}


var obj = getQueryStringData(exampleurl)

console.log(obj)

document.getElementById('output').textContent = JSON.stringify(obj)
<div id="output"></div>

答案 1 :(得分:0)

这是一种类型化对象属性的方法。如果字符串本身是表达式中的特殊匹配之一,则JSON.parse它,否则尝试Number,否则保持原样。

  function cast (o) {
    var result = {};
    for(var prop in o) { if(o.hasOwnProperty(prop)) {
      var val = o[prop];
      if (typeof val === 'object') return o[prop] = cast(val);
      result[prop] = /^(true|false|null|undefined)$/.test(val) ? JSON.parse(val) : Number(val) || val;
    }}
    return result;
  }

cast( { a: '123', b: 'null', c: 'abc' } )返回{a: 123, b: null, c: "abc"}