【问题标题】:Convert URL to json将 URL 转换为 json
【发布时间】:2013-07-03 05:06:39
【问题描述】:

我似乎找不到这个问题的答案。如何在 javascript 中将 URL 参数字符串转换为 JSON?我的意思是问是否有这样的内置功能或单线可以完成这项工作?

例子:

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

【问题讨论】:

  • 你使用 jquery 吗?如果是,请尝试如果您使用 jQuery,JSON.parse(this.yourURLString);或 jQuery.parseJSON(this.yourURLString);
  • This answer 返回您想要的对象类型。
  • 你问的是纯字符串到字符串的转换问题吗?或者正在使用像 node.js 这样的 JavaScript 服务器并有传入的参数,您希望将其转换为对象,然后大概转换为 JSON?
  • @RayToal 我刚刚发现如果给定的数据是 url 类型的字符串而不是对象,我正在寻找一种简单的方法将该字符串转换为 json,这样我的默认数据就不会被覆盖。我想我会添加一个自定义函数,我在下面的答案中已经建议了。
  • 明白。 Stapal 的回答很好并且可读。如果您对单线感兴趣,我添加了一个答案只是为了好玩。

标签: javascript json url


【解决方案1】:
function getFormData(data){
    data = data.replace('%20', ' ');
    var jsonObj= {};

    var sep = data.split('&');
    for (var i = 0; i < sep.length; i++) {
        var getVals = sep[i].split('=');
        jsonObj[getVals[0]] = getVals[1];
    }
    return jsonObj;
}

【讨论】:

    【解决方案2】:

    您可以创建一个返回 JSON 对象的方法

    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];
            // If you want to get in native datatypes
            // myJson[hash[0]] = JSON.parse(hash[1]); 
        }
        return myJson;
    }
    

    演示:http://jsfiddle.net/jAGN5/

    【讨论】:

    • 我要的是单线,但无论如何感谢这个功能,+rep :)
    • 这不会获取相同参数的所有值。例如,如果 URL 是 'some=params&over=here&over=there',则不会返回“over”参数列表。
    • 它将 'isParam=true' 转换为 { isParam: 'true' }
    【解决方案3】:

    您可能想尝试类似的方法

    var url = require('url')
    var your_json = url.parse( your_url, true );
    

    我从here得到这个

    【讨论】:

      【解决方案4】:

      我使用 satpalanswer 提供了一个很好的 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 将这些数据扔给 Web 服务。

      【讨论】:

        【解决方案5】:

        试试这个:

        var str = 'some1=param&some2=param2';
        
        JSON.parse('{"' + decodeURI(str).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"').replace(/\s/g,'') + '"}')
        
        // {some1: "param1", some2: "param2"}
        

        【讨论】:

          【解决方案6】:

          如果你追求的是单线,Underscore 库有一个名为 object 的漂亮函数,它接受一组对并从中构建一个对象:

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

          如果你使用下划线,你可以从你的查询字符串单行构造一个对象,如下所示:

          > 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\"}"
          

          这是live demo

          如果您不使用 Underscore,您可以随时编写自己的实用函数。

          这一行有点难看,但 Firefox 22 具有一些即将推出的 ES6 功能,例如数组解析和箭头,因此将来可以使代码更加紧凑,例如

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

          甚至

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

          或者也许只是坚持可读的 for 循环并创建自己的函数。 :)

          【讨论】:

            【解决方案7】:

            试试这个功能:

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

            【讨论】:

              猜你喜欢
              • 2013-07-11
              • 2023-04-06
              • 2015-09-02
              • 2016-05-09
              • 1970-01-01
              • 1970-01-01
              • 2018-01-22
              • 2013-07-06
              • 1970-01-01
              相关资源
              最近更新 更多