Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将x-www-form-urlencoded字符串转换为JSON?_Javascript_Json - Fatal编程技术网

Javascript 如何将x-www-form-urlencoded字符串转换为JSON?

Javascript 如何将x-www-form-urlencoded字符串转换为JSON?,javascript,json,Javascript,Json,应用程序示例/x-www-form-urlencoded string CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4 转换为JSON var gamePlayData = { CorrelationId: gameId, PickedNumbers: ["

应用程序示例/x-www-form-urlencoded string

CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4
转换为JSON

var gamePlayData = {
            CorrelationId: gameId,
            PickedNumbers: ["1","2","3","4"]
        };
试试这个->

// convert string to object
str = 'a=6&id=99';
var arr = str.split('&');
var obj = {};
for(var i = 0; i < arr.length; i++) {
    var bits = arr[i].split('=');
    obj[bits[0]] = bits[1];
}
//alert(obj.a);
//alert(obj.id);

// convert object back to string
str = '';
for(key in obj) {
    str += key + '=' + obj[key] + '&';
}
str = str.slice(0, str.length - 1); 
alert(str);
//将字符串转换为对象
str='a=6&id=99';
var arr=str.split('&');
var obj={};
对于(变量i=0;i

或者使用这个(JQuery)

以下代码应该可以实现这一点:

var str = 'CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4';
var keyValuePairs = str.split('&');
var json = {};
for(var i=0,len = keyValuePairs.length,tmp,key,value;i <len;i++) {
    tmp = keyValuePairs[i].split('=');
    key = decodeURIComponent(tmp[0]);
    value = decodeURIComponent(tmp[1]);
    if(key.search(/\[\]$/) != -1) {
        tmp = key.replace(/\[\]$/,'');
        json[tmp] = json[tmp] || [];
        json[tmp].push(value);
    }
    else {
        json[key] = value;
    }
}
var str='CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4';
var keyValuePairs=str.split('&');
var json={};

对于(var i=0,len=keyValuePairs.length,tmp,key,value;i,这里有一个纯JavaScript的方法。JavaScript框架也可以帮助您解决这个问题。EDIT:为了方便起见,我也加入了字典解析。参见第二个示例

function decodeFormParams(params) {
  var pairs = params.split('&'),
      result = {};

  for (var i = 0; i < pairs.length; i++) {
    var pair = pairs[i].split('='),
        key = decodeURIComponent(pair[0]),
        value = decodeURIComponent(pair[1]),
        isArray = /\[\]$/.test(key),
        dictMatch = key.match(/^(.+)\[([^\]]+)\]$/);

    if (dictMatch) {
      key = dictMatch[1];
      var subkey = dictMatch[2];

      result[key] = result[key] || {};
      result[key][subkey] = value;
    } else if (isArray) {
      key = key.substring(0, key.length-2);
      result[key] = result[key] || [];
      result[key].push(value);
    } else {
      result[key] = value;
    }
  }

  return result;
}

decodeFormParams("CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4");
// => {"CorrelationId":"1","PickedNumbers":["1","2","3","4"]}

decodeFormParams("a%5Bb%5D=c&a%5Bd%5D=e");
// => {"a":{"b":"c","d":"e"}}
函数decodeFormParams(params){
变量对=参数拆分('&'),
结果={};
对于(变量i=0;i{“CorrelationId”:“1”,“PickedNumber”:[“1”,“2”,“3”,“4”]}
decodeFormParams(“a%5Bb%5D=c&a%5Bd%5D=e”);
//=>{“a”:{“b”:“c”,“d”:“e”}

我最近一直在处理这个问题:我必须解析可能包含嵌套多达5层的对象的数据。我需要代码来处理这两个相当复杂的数据,但不能不解码像
id=213这样简单的URI

我花了相当长的时间在谷歌上,试图找到一个(半)优雅的解决方案来解决这个问题,这个问题不断出现。因为它每天有1个浏览量(给予或接受),我决定将我的解决方案发布在这里,希望它能帮助别人:

function form2Json(str)
{
    "use strict";
    var obj,i,pt,keys,j,ev;
    if (typeof form2Json.br !== 'function')
    {
        form2Json.br = function(repl)
        {
            if (repl.indexOf(']') !== -1)
            {
                return repl.replace(/\](.+?)(,|$)/g,function($1,$2,$3)
                {
                    return form2Json.br($2+'}'+$3);
                });
            }
            return repl;
        };
    }
    str = '{"'+(str.indexOf('%') !== -1 ? decodeURI(str) : str)+'"}';
    obj = str.replace(/\=/g,'":"').replace(/&/g,'","').replace(/\[/g,'":{"');
    obj = JSON.parse(obj.replace(/\](.+?)(,|$)/g,function($1,$2,$3){ return form2Json.br($2+'}'+$3);}));
    pt = ('&'+str).replace(/(\[|\]|\=)/g,'"$1"').replace(/\]"+/g,']').replace(/&([^\[\=]+?)(\[|\=)/g,'"&["$1]$2');
    pt = (pt + '"').replace(/^"&/,'').split('&');
    for (i=0;i<pt.length;i++)
    {
        ev = obj;
        keys = pt[i].match(/(?!:(\["))([^"]+?)(?=("\]))/g);
        for (j=0;j<keys.length;j++)
        {
            if (!ev.hasOwnProperty(keys[j]))
            {
                if (keys.length > (j + 1))
                {
                    ev[keys[j]] = {};
                }
                else
                {
                    ev[keys[j]] = pt[i].split('=')[1].replace(/"/g,'');
                    break;
                }
            }
            ev = ev[keys[j]];
        }
    }
    return obj;
}
它整洁地返回一个对象,当通过
JSON.stringify
时,该对象如下所示:

{"id":"007","name":{"title":"agent","first":"james","last":"bond"},"personalia":{"weakness":"women","occupation":"spy","strength":"women"},"tools":{"movement":{"far":"DBS","slow":"foot"},"weapons":{"close":{"silent":"garrot"},"medium":{"silent":"pistol_supressed","loud":"smg"},"far":{"silent":"sniper"}}}}

它通过JSLICT检查,忽略空白,<代码> <代码> >代码> [^…] /代码>,接受<代码> ++>代码>。总之,我认为这是可以接受的。

您需要jQueRe.PARAM。选项之一是

如果您使用节点或BurSeriType,可以使用。
var qs = require('qs')
var encodedString = "CorrelationId=1&PickedNumbers%5B%5D=1&PickedNumbers%5B%5D=2&PickedNumbers%5B%5D=3&PickedNumbers%5B%5D=4" 

console.log(qs.parse(encodedString))
// { CorrelationId: '1', PickedNumbers: [ '1', '2', '3', '4' ] }

这是Node.js现在的核心模块:

也适用于编码字符:

var json2 = qs.parse('http%3A%2F%2Fexample.com&sad=salad')
    // { url: 'http://example.com', sad: 'salad' }
string str=“RESULT=0&PNREF=A10AABBF8DF2&RESPMSG=Approved&AUTHCODE=668PNI&PREFPSMSG=No Rules Triggered&postfspsmsg=No Rules Triggered”

var sr=str.Replace(&),“=”;
字符串[]sp=sr.Split('=');
var spl=sp.长度;
int n=1;
var ss=“{”;
对于(var k=0;k
一行:

s='a=1&b=2&c=3';
Object.fromEntries(
s、 拆分(“&”)
.map(s=>s.split('='))
.map(pair=>pair.map(decodeURIComponent)))
//->{a:“1”,b:“2”,c:“3”}
如果要将重复参数表示为数组:

s='a=1&b=2&c[]=3&c[]=4&c[]=5&c[]=6';
s
.split(“&”)
.map(s=>s.split('='))
.map(pair=>pair.map(decodeURIComponent))
.reduce((备注,[键,值])=>{
如果(!(输入备忘录)){memo[key]=value;}
否则{
if(!(memo[key]数组实例))
备注[键]=[备注[键],值];
其他的
备注[键]。推送(值);
} 
返回备忘录;
}, {})
//->{“a”:“1”、“b”:“2”、“c[]”:[“3”、“4”、“5”、“6”]}

jQuery.param进行序列化-问题是关于反向操作。在节点中,您可以使用内置的
querystring
如果您添加一些解释会更好。我正在获取引用错误:如果(typeof form2Json.br!=“function”)您是最好的,则在第行中未定义form2Json。:)如果数据包含方括号,甚至引号,则代码无法正常工作将导致错误请使用真实变量名作为示例。这允许其他人阅读您答案中的代码。它是否考虑嵌套数组?
var qs = require('querystring')

var json = qs.parse('why=not&sad=salad')
    // { why: 'not', sad: 'salad' }
var json2 = qs.parse('http%3A%2F%2Fexample.com&sad=salad')
    // { url: 'http://example.com', sad: 'salad' }
public static void Main()

{
    var sr = str.Replace("&", "=");

    string[] sp = sr.Split('=');

    var spl = sp.Length;

    int n = 1;

    var ss = "{";

    for (var k = 0; k < spl; k++)
    {
        if (n % 2 == 0)
        {
            if (n == spl)
            {
                ss += '"' + sp[k] + '"';
            }
            else
            {
                ss += '"' + sp[k] + '"' + ",";
            }
        }
        else
        {
            ss += '"' + sp[k] + '"' + ":";
        }
        n++;
    }
    ss += "}";
    Console.WriteLine(ss);
}