JSON对象示例
var json = {"bindings": [ {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}, {"ircEvent": "PRIVMSG", "method": "deleteURI", "regex": "^delete.*"}, {"ircEvent": "PRIVMSG", "method": "randomURI", "regex": "^random.*"} ]}; |
JSON文本转对象
ie6/ie7中不支持JSON.parse()方法,所以使用以下方式将JSON文本转化为对象。
var obj = eval('(' + myJSONtext + ')'); |
JSON.stringify Function
JSON.stringify()方法可以将任意的javascript值序列化成JSON字符串。语法如下:
JSON.stringify(value [, replacer] [, space]) |
参数说明
- value: 将要序列化成 JSON 字符串的值,通常是对象或者数组。
- 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
- 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
- undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。
- 所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。
- 不可枚举的属性会被忽略。
- replacer: 可选
- 如果该参数是一个函数,则在序列化过程中,对象属性的键和值会作为参数传入此函数,最后返回经过该函数的转换和处理后的值,替代原先传入的值。
- 如果返回
undefined,则对应的属性键就会被忽略。 - 如果是根节点,返回空字符串
""。 - 如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的JSON字符串中,并且按此数组中的属性名顺序进行转化。
- space: 可选,指定缩进用的空白字符串,用于美化输出(pretty-print)。
- space为空,则返回字符串不会包括多余的空白字符。
- space是个数字,则返回结果中每层的属性名前会有对应的空格数量,超过10个空格按10个计算。
- space是
\t,则返回结果中每层会按tab进行缩进排版。 - space是其他字符,则返回结果中每层的属性名前会显示这些字符,只保留10个字符,多余的被忽略。
- 以下字符必须转义,
",\,\b,\f,\n,\r,\t,\uhhhh。
JSON.stringify()示例
JSON.stringify({}); // '{}'JSON.stringify(true); // 'true'JSON.stringify("foo"); // '"foo"'JSON.stringify([1, "false", false]); // '[1,"false",false]'JSON.stringify({ x: 5 }); // '{"x":5}'JSON.stringify({x: 5, y: 6});// '{"x":5,"y":6}' 或者 '{"y":6,"x":5}' 都可能 |
布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
JSON.stringify([new Number(1), new String("false"), new Boolean(false)]);// '[1,"false",false]' |
undefined、任意的function以及symbol值,在序列化过程中会被忽略。
JSON.stringify({x: undefined, y: Object, z: Symbol("")});// '{}'JSON.stringify([undefined, Object, Symbol("")]);// '[null,null,null]'JSON.stringify({[Symbol("foo")]: "foo"});// '{}'JSON.stringify({[Symbol.for("foo")]: "foo"}, [Symbol.for("foo")]);// '{}'JSON.stringify({[Symbol.for("foo")]: "foo"}, function (k, v) { if (typeof k === "symbol"){ return "a symbol"; }});// '{}' |
不可枚举的属性默认会被忽略。
JSON.stringify( Object.create(null, { x: { value: 'x', enumerable: false }, y: { value: 'y', enumerable: true } }) );// '{"y":"y"}' |
toJSON 方法
如果一个被序列化的对象拥有toJSON方法,那么该toJSON方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用toJSON方法后的返回值会被序列化,例如:
var obj = { foo: 'foo', toJSON: function () { return 'bar'; }};JSON.stringify(obj); // '"bar"'JSON.stringify({x: obj}); // '{"x":"bar"}' |
下面的例子使用制表符\t将对象格式化输出json字符串。
var contact = new Object();contact.firstname = "Jesper";contact.surname = "Aaberg";contact.phone = ["555-0100", "555-0120"];var memberfilter = new Array();memberfilter[0] = "surname";memberfilter[1] = "phone";var jsonText = JSON.stringify(contact, memberfilter, "\t");console.log(jsonText);// Output:// { "surname": "Aaberg", "phone": [ "555-0100", "555-0120" ] } |
下面这个例子将对象的属性值全部转成大写形式的。
var continents = new Array();continents[0] = "Europe";continents[1] = "Asia";continents[2] = "Australia";continents[3] = "Antarctica";continents[4] = "North America";continents[5] = "South America";continents[6] = "Africa";var jsonText = JSON.stringify(continents, replaceToUpper);function replaceToUpper(key, value) { return value.toString().toUpperCase();}// Output:// "EUROPE,ASIA,AUSTRALIA,ANTARCTICA,NORTH AMERICA,SOUTH AMERICA,AFRICA" |
以下例子使用toJSON方法实现属性值转大写。
var contact = new Object();contact.firstname = "Jesper";contact.surname = "Aaberg";contact.phone = ["555-0100", "555-0120"];contact.toJSON = function(key) { var replacement = new Object(); for (var val in this) { if (typeof (this[val]) === 'string') { replacement[val] = this[val].toUpperCase(); } else { replacement[val] = this[val]; } } return replacement;};var jsonText = JSON.stringify(contact);console.log(jsonText);// Output:// {"firstname":"JESPER","surname":"AABERG","phone":["555-0100","555-0120"]} |
JSON.parse Function
JSON.parse() 方法可以将一个 JSON 字符串解析成为一个 javascript 值。在解析过程中,还可以选择性的篡改某些属性的原始解析值。语法如下:
JSON.parse(text [, reviver]) |
参数说明
- text: 要解析的JSON字符串。
- reviver: 可选,一个函数,用来转换解析出的属性值。
- reviver返回合法值,使用此值替换原来的属性值。
- reviver返回
null或者undefined,对应属性名被删除。
返回值说明
从text字符串解析出的一个javascript对象或者数组。
异常
如果被解析的JSON字符串包含语法错误,则会抛出SyntaxError异常。JSON.parse()不允许逗号结尾,如下例:
JSON.parse('[1, 2, 3,]');// (program):1 Uncaught SyntaxError: Unexpected token ](…) |
示例一,字符串转对象
var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';var contact = JSON.parse(jsontext);console.log(contact.surname + ", " + contact.firstname);var arr = ["a", "b", "c"];var str = JSON.stringify(arr);console.log(str);var newArr = JSON.parse(str);while (newArr.length > 0) { console.log(newArr.pop() + "<br/>");} |
示例二,字符串转成对象
myData = JSON.parse(text, function (key, value) { var type; if (value && typeof value === 'object') { type = value.type; if (typeof type === 'string' && typeof window[type] === 'function') { // 可以通过这种方法,将日期字符串转化成js中的Date对象 return new (window[type])(value); } } return value;}); |
示例三,ISO日期格式字符串转化成UTC日期对象
var jsontext = '{ "hiredate": "2008-01-01T12:00:00Z", "birthdate": "2008-12-25T12:00:00Z" }';var dates = JSON.parse(jsontext, dateReviver);console.log(dates.birthdate.toUTCString());function dateReviver(key, value) { var a; if (typeof value === 'string') { a = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); if (a) { return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6])); } } return value;};// Output:// Thu, 25 Dec 2008 12:00:00 UTC |
示例四,使用reviver函数
如果指定了reviver函数,则解析出的javascript值(解析值)会经过一次转换后才将被最终返回(返回值)。
更具体点讲就是:解析值本身以及它所包含的所有属性,会按照一定的顺序(从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身)分别的去调用reviver函数,在调用过程中,当前属性所属的对象会作为this值,当前属性名和属性值会分别作为第一个和第二个参数传入reviver中。如果reviver返回undefined,则当前属性会从所属对象中删除,如果返回了其他值,则返回的值会成为当前属性新的属性值。
JSON.parse('{"p": 5}', function (k, v) { if(k === '') return v; // 如果到了最顶层,则直接返回属性值, return v * 2; // 否则将属性值变为原来的 2 倍。}); // { p: 10 }JSON.parse('{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}', function (k, v) { console.log(k); // 输出当前的属性名,从而得知遍历顺序是从内向外的, // 最后一个属性名会是个空字符串。 return v; // 返回原始属性值,相当于没有传递 reviver 参数。}); |