是否有任何本机函数将json转换为url参数?

Fel*_*les 51 javascript json

我需要将json对象转换为url形式,如:"parameter = 12&asd = 1"

我这样做了:

        var data = {
            'action':'actualiza_resultado',
            'postID': 1,
            'gl': 2,
            'gl2' : 3
        };

        var string_=JSON.stringify(data);

        string_=string_.replace(/{/g, "");
        string_=string_.replace(/}/g, "");
        string_=string_.replace(/:/g, "=")
        string_=string_.replace(/,/g, "&");
        string_=string_.replace(/"/g, "");
Run Code Online (Sandbox Code Playgroud)

但我想知道在javascript或JSON对象中是否有任何函数来执行此操作?

geo*_*org 106

param就是这么做的.如果你不使用jquery,请查看源代码.

如果你真的热衷于重新发明车轮,那就是这样的:

url = Object.keys(data).map(function(k) {
    return encodeURIComponent(k) + '=' + encodeURIComponent(data[k])
}).join('&')
Run Code Online (Sandbox Code Playgroud)

  • 可能有些人"热衷于重新发明轮子",因为他们没有使用jQuery - 无论是有什么好的或坏的原因. (8认同)
  • 不使用jquery不是重新发明轮子,听说过下划线? (6认同)
  • 更新:您可以使用本机 URLSearchParams:https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams (2认同)
  • 使用 URLSearchParams 处理嵌套对象时遇到问题 (2认同)
  • 请注意,URLSearchParams 不适用于任意 JSON,它仅适用于具有字符串值的平面对象。例如,“new URLSearchParams({a: {b: 1}}).toString()”变为“a=%5Bobject+Object%5D”。 (2认同)

Tar*_*req 21

使用ES6语法:

var data = {
  'action':'actualiza_resultado',
  'postID': 1,
  'gl': 2,
  'gl2' : 3
};

let urlParameters = Object.entries(data).map(e => e.join('=')).join('&');

console.log(urlParameters);
Run Code Online (Sandbox Code Playgroud)


ish*_*ex2 8

我做了一个支持嵌套对象和数组的实现,即

var data = {
    users: [
    {
      "name": "jeff",
      "tasks": [
        "Do one thing",
        "Do second thing"
      ]
    },
    {
      "name": "rick",
      "tasks": [
        "Never gonna give you up",
        "Never gonna let you down"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

将会:

users[0][name]=jeff&users[0][tasks][0]=Do%20one%20thing&users[0][tasks][1]=Do%20second%20thing&users[1][name]=rick&users[1][tasks][0]=Never%20gonna%20give%20you%20up&users[1][tasks][1]=Never%20gonna%20let%20you%20down
Run Code Online (Sandbox Code Playgroud)

所以,这是实现:

var data = {
    users: [
    {
      "name": "jeff",
      "tasks": [
        "Do one thing",
        "Do second thing"
      ]
    },
    {
      "name": "rick",
      "tasks": [
        "Never gonna give you up",
        "Never gonna let you down"
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

  • 被低估的答案!+1 (2认同)

Min*_*hev 5

您不需要序列化此对象文字.

更好的方法是这样的:

function getAsUriParameters(data) {
   var url = '';
   for (var prop in data) {
      url += encodeURIComponent(prop) + '=' + 
          encodeURIComponent(data[prop]) + '&';
   }
   return url.substring(0, url.length - 1)
}
getAsUriParameters(data); //"action=actualiza_resultado&postID=1&gl=2&gl2=3"
Run Code Online (Sandbox Code Playgroud)


Gui*_*rme 5

就像@georg 所说的那样,您可以将JQuery.param用于平面对象。

如果您需要处理复杂的对象,您可以使用JsonUri,这是一个可以做到这一点的 Python 包。它也有 JavaScript 库

免责声明:我是 JSONURI 的作者

编辑:我后来了解到你也可以只对你的负载进行 base64 编码 - 大多数语言都支持 base64 编码/解码

例子

x = {name: 'Petter', age: 47, places: ['Mozambique', 'Zimbabwe']}
stringRep = JSON.stringify(x)
encoded = window.btoa(stringRep)
Run Code Online (Sandbox Code Playgroud)

为您提供eyJuYW1lIjoiUGV0dGVyIiwiYWdlIjo0NywicGxhY2VzIjpbIk1vemFtYmlxdWUiLCJaaW1iYWJ3ZSJdfQ==,您可以将其用作 uri 参数

decoded = window.atob(encoded)
originalX = JSON.parse(decoded)
Run Code Online (Sandbox Code Playgroud)

不用说,它有自己的警告


Cez*_* D. 5

我发现在ES6中看起来不错:

function urlfy(obj) {
    return Object
        .keys(obj)
        .map(k => `${encodeURIComponent(k)}=${encodeURIComponent(obj[k])}`)
        .join('&');
}
Run Code Online (Sandbox Code Playgroud)

以后更新(相同的东西,也许更干净):

const urlfy = obj => Object
    .keys(obj)
    .map(k => encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]))
    .join('&');
Run Code Online (Sandbox Code Playgroud)