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

但我只得到:

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

如何解决?

4

2 回答 2

1

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

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

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

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));

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

var b = [];
b.something=22
console.log(b.something);
console.log(JSON.stringify(b));//=[]
console.log(b.hasOwnProperty("something"))//=true


b = {};
b.something=22
console.log(b.something);
console.log(JSON.stringify(b));//={"something":22}
console.log(b.hasOwnProperty("something"))//=true
于 2013-08-16T07:01:54.310 回答
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 规范不保证这种顺序。

于 2013-08-16T07:10:01.640 回答