JSON字符串化数组的值

时间:2013-08-16 07:00:03

标签: javascript json

我正在尝试对一个对象进行字符串化,但不知道为什么它没有按预期工作:

function request(url) {
  this.url = url;
  this.head = [];
}

var r = new request("http://test.com");
r.head["cookie"] = "version=1; skin=new";
r.head["agent"] = "Browser 1.0";
document.write(JSON.stringify(r));

我希望这个对象可以字符串化为:

{"url":"http://test.com","head":["cookie":"version=1; skin=new", "agent":"Browser 1.0"]}

但我只得到:

{"url":"http://test.com","head":[]}

如何解决?

2 个答案:

答案 0 :(得分:1)

你希望r的hear属性是我认为的关联数组(就像在PHP中一样)。它们不存在于JavaScript中。数组的值由数字索引。

由于r.head是一个对象(数组是JS中的对象),您可以使用r.head["whatever property name"]="value"向其添加属性,但是当您使用JSON.stringify时,这些属性似乎不会被序列化为JSON,因为{{ 1}}被定义为一个数组,它只会序列化编号的索引值。

要解决此问题,您可以将r.head定义为对象,以便JSON.stringify将序列化所有属性。

r.head

如果您在cosole中运行以下代码(在浏览器中按F12),您会发现数组的序列化方式与对象不同:

function request(url) {
  this.url = url;
  this.head = {};
}

var r = new request("http://test.com");
r.head["cookie"] = "version=1; skin=new";
r.head["agent"] = "Browser 1.0";
document.write(JSON.stringify(r));

答案 1 :(得分:1)

按照你希望的方式将它序列化是不可能的。

使用此对象:

function request(url) {
  this.url = url;
  this.head = []; 
}

此变体:

var r = new request("http://test.com");
r.head.push({"cookie": "version=1; skin=new"});
r.head.push({"agent": "Browser 1.0"});

document.write(JSON.stringify(r));

会给你:

{"url":"http://test.com","head":[{"cookie":"version=1; skin=new"},{"agent":"Browser 1.0"}]}

如果您要将对象更改为:

function request(url) {
  this.url = url;
  this.head = {}; 
}

var r = new request("http://test.com");
r.head["cookie"] = "version=1; skin=new";
r.head["agent"] = "Browser 1.0";

document.write(JSON.stringify(r));

会给你:

{"url":"http://test.com","head":{"cookie":"version=1; skin=new","agent":"Browser 1.0"}}

第一个变体保证在迭代时按顺序为您提供头值。它的优点还在于,如果您感兴趣,可以稍后按特定顺序插入内容。

按照惯例,只要没有基于数字的键,第二个版本就会按照插入的顺序返回项目,但ecma规范不保证这种顺序。