细说JSON

来源:互联网 发布:java swing下拉框联想 编辑:程序博客网 时间:2024/05/21 23:32

概念

        JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。它是基于 JavaScript Programming Language , Standard ECMA-262 3rd Edition - December 1999 的一个子集。

注意点

        属性名称必须用双引号包裹;最后一个属性后面不能有逗号。

        前导0不能使用(在 JSON.stringify 中将会被忽略,在 JSON.parse 会抛出错误); 小数点后面至少有一个数字。

        只有有限的字符能够被转义;不允许某些控制字符;但允许使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ; 字符串必须用双引号括起来。

两种结构

对象:“名称/值”对的集合

        一个对象以“{”左大括号开始,“}”(右大括号)结束。每个“名称、值”之间用一个“:”(冒号)隔开;“‘名称/值’ 对”之间用 一个“,”(逗号)分隔。 名称用引号括起来;值如果是字符串则必须用括号,数值型则不须要。

  1. var jsonObj = {
  2. "name": "staven",
  3. "sex": "man"
  4. }

数组:值的有序列表

        数组是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间运用 “,”(逗号)分隔。

  1. var jsonObj = [
  2. {
  3. "name": "staven",
  4. "sex": "man"
  5. },{
  6. "name": "赫连小妖",
  7. "character": "handsome"
  8. }
  9. ];

JSON字符串转换为JSON对象

eval()

  1. var jsonStr = '{"name": "staven","sex": "man"}';
  2. var result = eval("("+ jsonStr +")");
  3. alert(typeof result);  //object

JSON.parse()

  1. var jsonStr = '{"name": "staven","sex": "man"}';
  2. var result = JSON.parse(jsonStr);
  3. alert(typeof result);  //object

eval的安全性:

  1. var value = 1;
  2. var jsonstr = '{"data1":"hello","data2":++value}';
  3. var data1 = eval('('+jsonstr+')');
  4. console.log(data1);  //Object {data1: "hello", data2: 2}
  5. var data2=JSON.parse(jsonstr);
  6. console.log(data2);  //VM82:1 Uncaught SyntaxError: Unexpected token +

        eval在解析字符串时,会执行该字符串中的代码,在代码中使用eval是很危险的,特别是用它执行第三方的JSON数据(其中可能包含恶意代码)时,尽可能使用JSON.parse()方法解析字符串本身。该方法可以捕捉JSON中的语法错误,并允许你传入一个函数,用来过滤或转换解析结果。

JSON对象转换为JSON字符串

JSON.stringify()

  1. var jsonObj = {"name": "staven","sex": "man"};
  2. var result = JSON.stringify(jsonObj);
  3. alert(typeof result);  //string

        此外parseJSON()也可以将JSON字符串转换为JSON对象,stringify()可以将JSON对象转换为JSON字符串,这两个方法均需要引入json.js包。

兼容性

        JSON 对象不被旧版本浏览器支持。你可以把下面代码放到脚本的开始位置,这样就可以在那些没有原生支持 JSON 对象的浏览器(比如IE6)中使用 JSON 对象。

  1. if (!window.JSON) {
  2.   window.JSON = {
  3.     parse: function(sJSON) { return eval('(' + sJSON + ')'); },
  4.     stringify: (function () {
  5.       var toString = Object.prototype.toString;
  6.       var isArray = Array.isArray || function (a) { return toString.call(a) === '[object Array]'; };
  7.       var escMap = {'"': '\\"', '\\': '\\\\', '\b': '\\b', '\f': '\\f', '\n': '\\n', '\r': '\\r', '\t': '\\t'};
  8.       var escFunc = function (m) { return escMap[m] || '\\u' + (m.charCodeAt(0) + 0x10000).toString(16).substr(1); };
  9.       var escRE = /[\\"\u0000-\u001F\u2028\u2029]/g;
  10.       return function stringify(value) {
  11.         if (value == null) {
  12.           return 'null';
  13.         } else if (typeof value === 'number') {
  14.           return isFinite(value) ? value.toString() : 'null';
  15.         } else if (typeof value === 'boolean') {
  16.           return value.toString();
  17.         } else if (typeof value === 'object') {
  18.           if (typeof value.toJSON === 'function') {
  19.             return stringify(value.toJSON());
  20.           } else if (isArray(value)) {
  21.             var res = '[';
  22.             for (var i = 0; i < value.length; i++)
  23.               res += (? ', ' : '') + stringify(value[i]);
  24.             return res + ']';
  25.           } else if (toString.call(value) === '[object Object]') {
  26.             var tmp = [];
  27.             for (var k in value) {
  28.               if (value.hasOwnProperty(k))
  29.                 tmp.push(stringify(k) + ': ' + stringify(value[k]));
  30.             }
  31.             return '{' + tmp.join(', ') + '}';
  32.           }
  33.         }
  34.         return '"' + value.toString().replace(escRE, escFunc) + '"';
  35.       };
  36.     })()
  37.   };
  38. }

JSON 合并函数

  1. var extend = function(des, src, override) {
  2. if (src instanceof Array) {
  3. for (var i = 0, len = src.length; i < len; i++){
  4. extend(des, src[i], override);
  5. }
  6. }
  7. for (var i in src) {
  8. if (override || !(in des)) {
  9. des[i] = src[i];
  10. }
  11. }
  12. return des;
  13. };
  14. var person1 ={"name":"staven","character":"handsome"};
  15. var person2 = {"name":"赫连小妖","sex":"man","habby":"sleep"};
  16. var person = extend({}, [person1, person2]);
  17. console.log(person);

JSON排序函数

  1. // 函数功能:json 排序 
  2. // key:(string)排序字段, 
  3. // onOff: (bool) 是否倒置(是,为倒序) 
  4. // fn (parse)转换类型 
  5. var sortBy = function(key, onOff, fn) {
  6. onOff = (onOff) ? -1 : 1;
  7. return function(a, b) {
  8. = a[key];
  9. = b[key];
  10. if (typeof(fn) != "undefined") {
  11. = fn(a);
  12. = fn(b);
  13. }
  14. if (< b) {
  15. return onOff * -1;
  16. }
  17. if (> b) {
  18. return onOff * 1;
  19. }
  20. return 1;
  21. }
  22. };
  23. var person = [
  24. {
  25. "name": "staven",
  26. "sex": "man"
  27. },{
  28. "name": "赫连小妖",
  29. "character": "handsome"
  30. },{
  31. "name":"hhh"
  32. }
  33. ];
  34. console.log(person.sort(sortBy('name'), 0, parseInt));
0 0