我正在尝试对一个对象进行字符串化,但不知道为什么它没有按预期工作:
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":[]}
如何解决?
答案 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规范不保证这种顺序。