JSON 是一种用来序列化对象、数组、数值、字符串、布尔值和 null 的语法。它基于 JavaScript 语法,但是又有区别:一些 JavaScript 值不是 JSON,而某些 JSON 不是 JavaScript 值
JSON表示的对象和数组: 属性名称必须用双引号包裹;最后一个属性后面不能有逗号。
JSON表示的数值: 前导0不能使用;小数点后面至少有一个数字。
JSON表示的字符串: 只有有限的字符能够被转义;通常不允许控制字符; 但允许使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ; 字符串必须用双引号括起来. 在Javascript中,下面的示例中 JSON.parse() 能够正常解析但 SyntaxError 会出错:
JSON.parse() 方法可以将一个 JSON 字符串解析成为一个 JavaScript 值,在解析过程中,还可以选择性的修改某些属性的原始解析值,
语法:JSON.parse(text[, func]),从text字符串解析出的一个 Object;
如果指定了func函数,则解析出的 JavaScript 值(解析值)会经过一次转换后才将被最终返回(返回值)。更具体点讲就是:解析值本身以及它所包含的所有属性,会按照一定的顺序(从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身)分别的去调func函数,在调用过程中,当前属性所属的对象会作为 this 值,当前属性名和属性值会分别作为第一个和第二个参数传入func中。如果func返回 undefined,则当前属性会从所属对象中删除,如果返回了其他值,则返回的值会成为当前属性新的属性值。当遍历到最顶层的值(解析值)时,传入 func 函数的参数会是空字符串 ""(因为此时已经没有真正的属性)和当前的解析值(有可能已经被修改过了),当前的 this 值会是 {"": 修改过的解析值},在编写 func 函数时,要注意到这个特例。
JSON.stringify() 方法可以将任意的 JavaScript 值序列化成 JSON 字符串
语法: JSON.stringify(JSvalue [, replacer [, space] ]) ,返回JSON字符串
可选参数replacer,如果该参数是一个函数,则在序列化过程中,被序列化的值的每个属性都会经过该函数的转换和处理;如果该参数是一个数组,则只有包含在这个数组中的属性名才会被序列化到最终的 JSON 字符串中;
可选参数space,用来控制结果字符串里面的间距。如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);如果是一个字符串,则每一级别会比上一级别多缩进用该字符串(或该字符串的前十个字符)
var s1 = JSON.stringify({a:1,b:2,c:3,d:4}, ['a','b','c'],'属性:');
console.log(s1);
/*
{
属性:"a": 1,
属性:"b": 2,
属性:"c": 3
}
*/
关于序列化,有下面五点注意事项:
1.非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中。
2.布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值。
3.undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。
4.所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们。
5.不可枚举的属性会被忽略
如果一个被序列化的对象拥有 toJSON 方法,那么该 toJSON 方法就会覆盖该对象默认的序列化行为:不是那个对象被序列化,而是调用 toJSON 方法后的返回值会被序列化
var session = {
screens : [],
state : true,
toJSON:function() {
return{
screens_11:this.screens,
state_11: this.state
}
}
};
session.screens.push({"name":"screenA"});
session.screens.push({"name":"screenB"});
var jsonStr = JSON.stringify(session);
console.log(jsonStr);
//{"screens_11":[{"name":"screenA"},{"name":"screenB"}],"state_11":true}
var res = JSON.parse(jsonStr);
console.log(res);
//{ screens_11: [ { name: 'screenA' }, { name: 'screenB' } ],state_11: true }
完整的JSON语法如下:
JSON = null
or true or false
or JSONNumber
or JSONString
or JSONObject
or JSONArray
JSONNumber = - PositiveNumber
or PositiveNumber
PositiveNumber = DecimalNumber
or DecimalNumber . Digits
or DecimalNumber . Digits ExponentPart
or DecimalNumber ExponentPart
DecimalNumber = 0
or OneToNine Digits
ExponentPart = e Exponent
or E Exponent
Exponent = Digits
or + Digits
or - Digits
Digits = Digit
or Digits Digit
Digit = 0 through 9
OneToNine = 1 through 9
JSONString = ""
or " StringCharacters "
StringCharacters = StringCharacter
or StringCharacters StringCharacter
StringCharacter = any character
except " or \ or U+0000 through U+001F
or EscapeSequence
EscapeSequence = \" or \/ or \\ or \b or \f or \n or \r or \t
or \u HexDigit HexDigit HexDigit HexDigit
HexDigit = 0 through 9
or A through F
or a through f
JSONObject = { }
or { Members }
Members = JSONString : JSON
or Members , JSONString : JSON
JSONArray = [ ]
or [ ArrayElements ]
ArrayElements = JSON
or ArrayElements , JSON
空白字符可以出现在任意位置,但是数值类型的数字中间不能有空白字符,字符串中间不能随意添加空白字符,因为添加的空白字符会被解释为相应的字符值,从而引起错误。有效空白字符只包括制表符 (U+0009)、回车符 (U+000D)、换行符 (U+000A) 和空格 (U+0020) 。