Json解析
javascript中没有一种数据类型叫做"JSON对象".可以说JSON对象是在一种特殊环境上下文中产生的叫法,JSON在日常的表现形式更多的是一个拥有复杂数据结构的字符串, 只是可以被转换为对象,规范里也明确地说了JSON只是一个数据交换语言,只有我们将之用在string上下文的时候它才叫JSON。{ "prop": "val" } 这样的声明有可能是JavaScript对象字面量也有可能是JSON字符串,取决于什么上下文使用它,如果是用在string上下文(用单引号或双引号引住,或者从text文件读取)的话,那它就是JSON字符串,如果是用在对象字面量上下文中,那它就是对象字面量。
// 这是JSON字符串
var foo = '{ "prop": "val" }';
// 这是对象字面量
var bar = { "prop": "val" };
console.log(bar.prop); //val
而且要注意,JSON有非常严格的语法,在string上下文里{ "prop": "val" } 是个合法的JSON,但{ prop: "val" }和{ 'prop': 'val' }确实不合法的。所有属性名称和它的值都必须用双引号引住,不能使用单引号。另外,即便你用了转义以后的单引号也是不合法的
如下都是书写错误的
{ name: "张三", 'age': 32 } // 属性名必须使用双引号
[32, 64, 128, 0xFFF] // 不能使用十六进制值
{ "name": "张三", age: undefined } // 不能使用undefined
{ "name": "张三","birthday": new Date('Fri, 26 Aug 2011 07:13:10 GMT'),
"getName": function() {
return this.name;
}
} // 不能使用函数和日期对象
如下规范
var j1 = ["one", "two", "three"];
var j2 = { "one": 1, "two": 2, "three": 3 };
var j3 = { "names": ["张三", "李四"] };
var j4 = [{ "name": "张三" }, { "name": "李四" }];
注意空数组和空对象都是符合规范的JSON值, null本身也没有问题
JSON不一定非要是{}或者[],而是两者均可
新增了JSON对象专门用来处理JSON格式,并且附加了stringify()和parse()两个方法.
var j5 = JSON.stringify("abc");
// "abc"
var j6 = JSON.stringify({ name: "张三" });
// {"name":"张三"}
console.log(j5);
这里转为的时候如果遇到一个值是undefined或者是函数, 那么该值会被省略, 除非这个值是数组的成员, 则返回null.
var j7 = JSON.stringify({ f: function () { }, a: [function () { }, undefined] }); // "{"a":[null,null]}"
第一个参数是要转换的对象, 第二个参数可以没有, 也可以是数组参数表示要转化的属性, 或者是一个函数用来更改默认的转换.
var j8 = JSON.stringify({ a: 1, b: 2 }, ['a']); // "{"a":1}"
var j9 = JSON.stringify({ a: 1, b: 2 }, f) // "{"a":2,"b":4}"
function f(key, value) {
if (typeof value === "number") {
value = 2 * value;
}
return value;
}
想要将一个字符串转换为JSON对象,那么传入的字符串一定要是有效的格式,否则程序会出错,为了防止意外可以将这个过程放到try/catch代码块中.
function f(key, value) {
if (key === "") {
return value;
}
if (key === "a") {
return value + 10;
}
if (key === "b") {
return value + 10;
}
}
var o = JSON.parse('{"a":1,"b":2}', f);
console.log(o.a); //2
var obj = {
name: 'wangkai',
age: 22, address: 'henan',
say: function () { console.log('我的名字是' + this.name); }
};
obj.say();
缺点是 没法复用,所以更适合用于只一个对象的.层级关系,类似于文件夹,包的形式,命名空间
var kai = {};
kai.relationship = {
teacher: {
name: 'liulaogen',
age: 45,
say: function () { console.log('我是你们的老师' + this.name + ',现在开始上课') }
},
parents: {
phone: '15210000000',
docook: function () {
console.log('我是' + this.name + ',我来给你做饭')
}
}
}
console.log(kai.relationship.teacher.name);
kai.relationship.parents.docook();