概念
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。
注意点
属性名称必须用双引号包裹;最后一个属性后面不能有逗号。
前导0不能使用(在 JSON.stringify 中将会被忽略,在 JSON.parse 会抛出错误); 小数点后面至少有一个数字。
只有有限的字符能够被转义;不允许某些控制字符;但允许使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ; 字符串必须用双引号括起来。
两种结构
对象:“名称/值”对的集合
一个对象以“{”左大括号开始,“}”(右大括号)结束。每个“名称、值”之间用一个“:”(冒号)隔开;“‘名称/值’ 对”之间用 一个“,”(逗号)分隔。 名称用引号括起来;值如果是字符串则必须用括号,数值型则不须要。
- var jsonObj = {
- "name": "staven",
- "sex": "man"
- }
数组:值的有序列表
数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间运用 “,”(逗号)分隔。
- var jsonObj = [
- {
- "name": "staven",
- "sex": "man"
- },{
- "name": "赫连小妖",
- "character": "handsome"
- }
- ];
JSON字符串转换为JSON对象
eval()
- var jsonStr = '{"name": "staven","sex": "man"}';
- var result = eval("("+ jsonStr +")");
- alert(typeof result); //object
JSON.parse()
- var jsonStr = '{"name": "staven","sex": "man"}';
- var result = JSON.parse(jsonStr);
- alert(typeof result); //object
eval的安全性:
- var value = 1;
- var jsonstr = '{"data1":"hello","data2":++value}';
- var data1 = eval('('+jsonstr+')');
- console.log(data1); //Object {data1: "hello", data2: 2}
- var data2=JSON.parse(jsonstr);
- console.log(data2); //VM82:1 Uncaught SyntaxError: Unexpected token +
eval在解析字符串时,会执行该字符串中的代码,在代码中使用eval是很危险的,特别是用它执行第三方的JSON数据(其中可能包含恶意代码)时,尽可能使用JSON.parse()方法解析字符串本身。该方法可以捕捉JSON中的语法错误,并允许你传入一个函数,用来过滤或转换解析结果。
JSON对象转换为JSON字符串
JSON.stringify()
- var jsonObj = {"name": "staven","sex": "man"};
- var result = JSON.stringify(jsonObj);
- alert(typeof result); //string
此外parseJSON()也可以将JSON字符串转换为JSON对象,stringify()可以将JSON对象转换为JSON字符串,这两个方法均需要引入json.js包。
兼容性
JSON 对象不被旧版本浏览器支持。你可以把下面代码放到脚本的开始位置,这样就可以在那些没有原生支持 JSON 对象的浏览器(比如IE6)中使用 JSON 对象。
- if (!window.JSON) {
- window.JSON = {
- parse: function(sJSON) { return eval('(' + sJSON + ')'); },
- stringify: (function () {
- var toString = Object.prototype.toString;
- var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; };
- var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'};
- var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); };
- var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g;
- return function stringify(value) {
- if (value == null) {
- return 'null';
- } else if (typeof value === 'number') {
- return isFinite(value) ? value.toString() : 'null';
- } else if (typeof value === 'boolean') {
- return value.toString();
- } else if (typeof value === 'object') {
- if (typeof value.toJSON === 'function') {
- return stringify(value.toJSON());
- } else if (isArray(value)) {
- var res = '[';
- for (var i = 0; i < value.length; i++)
- res += (i ? ', ' : '') + stringify(value[i]);
- return res + ']';
- } else if (toString.call(value) === '[object Object]') {
- var tmp = [];
- for (var k in value) {
- if (value.hasOwnProperty(k))
- tmp.push(stringify(k) + ': ' + stringify(value[k]));
- }
- return '{' + tmp.join(', ') + '}';
- }
- }
- return '"' + value.toString().replace(escRE, escFunc) + '"';
- };
- })()
- };
- }
JSON 合并函数
- var extend = function(des, src, override) {
- if (src instanceof Array) {
- for (var i = 0, len = src.length; i < len; i++){
- extend(des, src[i], override);
- }
- }
- for (var i in src) {
- if (override || !(i in des)) {
- des[i] = src[i];
- }
- }
- return des;
- };
- var person1 ={"name":"staven","character":"handsome"};
- var person2 = {"name":"赫连小妖","sex":"man","habby":"sleep"};
- var person = extend({}, [person1, person2]);
- console.log(person);
JSON排序函数
- // 函数功能:json 排序
- // key:(string)排序字段,
- // onOff: (bool) 是否倒置(是,为倒序)
- // fn (parse)转换类型
- var sortBy = function(key, onOff, fn) {
- onOff = (onOff) ? -1 : 1;
- return function(a, b) {
- a = a[key];
- b = b[key];
- if (typeof(fn) != "undefined") {
- a = fn(a);
- b = fn(b);
- }
- if (a < b) {
- return onOff * -1;
- }
- if (a > b) {
- return onOff * 1;
- }
- return 1;
- }
- };
- var person = [
- {
- "name": "staven",
- "sex": "man"
- },{
- "name": "赫连小妖",
- "character": "handsome"
- },{
- "name":"hhh"
- }
- ];
- console.log(person.sort(sortBy('name'), 0, parseInt));