1

我正在尝试序列化一个 javascript 对象,但使用特定的形式(我认为它必须是一种方法)。例子:

var media = new Object();
media.url = "localhost";
media.foo = "asd"

var data=new Object();
data.title = "myTitle";
data.description = "myDescription";
data.media.push(media);

我需要以这种方式序列化数据:

"title=myTitle&description=myDescription&media[0].url=localhost&media[0].foo=asd"

重要的是数组的写入方式。

4

5 回答 5

1

查看Convert a JSON object's keys into dot notation pathsConvert complex JavaScript object to dot notation object。您可以轻松地调整它们以处理特殊的数组键:

function transform(obj) {
    var result = {};
    recurse(obj, "");
    return result;
    function recurse(o, name) {
        if (Object(o) !== o)
            result[name] = o;
        else if (Array.isArray(o))
            for (var i=0; i<o.length; i++)
                recurse(o[i], name+"["+i+"]");
        else // if plain object?
            for (var p in o)
                recurse(o[p], name?name+"."+p:p);
    }
}

然后,您可以应用$.param结果以获取 URL 编码等:

$.param(transform(data))

(或者只是将其传递给 的 data 参数$.ajax)。

于 2013-06-27T19:32:11.870 回答
0

有多种方法可以将对象序列化为参数列表(字符串),看看:

如何将对象序列化为参数列表?

一个示例是如下方法:

var str = "";
for (var key in obj) {
   if (str != "") {
       str += "&";
   }
   str += key + "=" + obj[key];
}

您可以修改它以适合您需要的样式。

于 2013-06-27T19:19:28.407 回答
0

对不起,但我需要改变。认为这更容易,但在查看结果时,我发现它并不是那么直截了当。如果您使用的是 jquery,尽管您可以简单地这样做:

var media = new Object();
media.url = "localhost";
media.foo = "asd"

var data=new Object();
data.title = "myTitle";
data.description = "myDescription";
data.media = []; // you forgot this...
data.media.push(media);

var data = $.param(data));
于 2013-06-27T19:20:24.347 回答
0

你可以使用 jQuery.param 来做到这一点:

$.param({a:'2', b: 1.2, c: "hello world"})// -> a=2&b=1.2&c=hello+world

EDIT

我上面缺少的是数组支持对不起。

为此,您需要 decodeURIComponent()

var media = new Object();
media.url = "localhost";
media.foo = "asd"

var data=new Object();
data.title = "myTitle";
data.description = "myDescription";
data.media = [];
data.media.push(media);
alert(decodeURIComponent($.param(data)));

输出:

标题=myTitle&description=myDescription&media[0][url]=localhost&media[0][foo]=asd

http://jsfiddle.net/bLu8Q/

于 2013-06-27T19:22:20.457 回答
0

jQuery 通过jQuery.param提供这个

var params = $.param(data);
console.log(params);

产生:

title=myTitle&description=myDescription&media%5B0%5D%5Burl%5D=localhost&media%5B0%5D%5Bfoo%5D=asd

如您所见,它可以根据需要处理嵌套数组和对象(%5B并且是and%5D的 URL 编码)。[]

如果您正在使用$.ajax()或其快捷方式之一,则无需显式调用它。如果您提供对象作为data参数或选项,jQuery 将使用此方法自动序列化它。

于 2013-06-27T19:25:13.780 回答