當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
JavaScript学习笔记-JSON对象
生活随笔
收集整理的這篇文章主要介紹了
JavaScript学习笔记-JSON对象
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
JSON 是一種用來序列化對象、數(shù)組、數(shù)值、字符串、布爾值和 null 的語法。它基于 JavaScript 語法,但是又有區(qū)別:一些 JavaScript 值不是 JSON,而某些 JSON 不是 JavaScript 值 ?JSON表示的對象和數(shù)組: 屬性名稱必須用雙引號包裹;最后一個(gè)屬性后面不能有逗號。 ?JSON表示的數(shù)值: 前導(dǎo)0不能使用;小數(shù)點(diǎn)后面至少有一個(gè)數(shù)字。 ?JSON表示的字符串: 只有有限的字符能夠被轉(zhuǎn)義;通常不允許控制字符; 但允許使用Unicode 行分隔符 (U+2028) 和段落分隔符 (U+2029) ; 字符串必須用雙引號括起來. 在Javascript中,下面的示例中 JSON.parse() 能夠正常解析但 SyntaxError 會(huì)出錯(cuò): JSON.parse() 方法可以將一個(gè) JSON 字符串解析成為一個(gè) JavaScript 值,在解析過程中,還可以選擇性的修改某些屬性的原始解析值, 語法:JSON.parse(text[, func]),從text字符串解析出的一個(gè) Object; 如果指定了func函數(shù),則解析出的 JavaScript 值(解析值)會(huì)經(jīng)過一次轉(zhuǎn)換后才將被最終返回(返回值)。更具體點(diǎn)講就是:解析值本身以及它所包含的所有屬性,會(huì)按照一定的順序(從最最里層的屬性開始,一級級往外,最終到達(dá)頂層,也就是解析值本身)分別的去調(diào)func函數(shù),在調(diào)用過程中,當(dāng)前屬性所屬的對象會(huì)作為 this 值,當(dāng)前屬性名和屬性值會(huì)分別作為第一個(gè)和第二個(gè)參數(shù)傳入func中。如果func返回 undefined,則當(dāng)前屬性會(huì)從所屬對象中刪除,如果返回了其他值,則返回的值會(huì)成為當(dāng)前屬性新的屬性值。當(dāng)遍歷到最頂層的值(解析值)時(shí),傳入 func 函數(shù)的參數(shù)會(huì)是空字符串 ""(因?yàn)榇藭r(shí)已經(jīng)沒有真正的屬性)和當(dāng)前的解析值(有可能已經(jīng)被修改過了),當(dāng)前的 this 值會(huì)是 {"": 修改過的解析值},在編寫 func 函數(shù)時(shí),要注意到這個(gè)特例。
JSON.stringify() 方法可以將任意的 JavaScript 值序列化成 JSON 字符串 語法: JSON.stringify(JSvalue [, replacer [, space] ]) ,返回JSON字符串 可選參數(shù)replacer,如果該參數(shù)是一個(gè)函數(shù),則在序列化過程中,被序列化的值的每個(gè)屬性都會(huì)經(jīng)過該函數(shù)的轉(zhuǎn)換和處理;如果該參數(shù)是一個(gè)數(shù)組,則只有包含在這個(gè)數(shù)組中的屬性名才會(huì)被序列化到最終的 JSON 字符串中; 可選參數(shù)space,用來控制結(jié)果字符串里面的間距。如果是一個(gè)數(shù)字, 則在字符串化時(shí)每一級別會(huì)比上一級別縮進(jìn)多這個(gè)數(shù)字值的空格(最多10個(gè)空格);如果是一個(gè)字符串,則每一級別會(huì)比上一級別多縮進(jìn)用該字符串(或該字符串的前十個(gè)字符) var s1 = JSON.stringify({a:1,b:2,c:3,d:4}, ['a','b','c'],'屬性:');
console.log(s1);
/*
{
屬性:"a": 1,
屬性:"b": 2,
屬性:"c": 3
}
*/ 關(guān)于序列化,有下面五點(diǎn)注意事項(xiàng): 1.非數(shù)組對象的屬性不能保證以特定的順序出現(xiàn)在序列化后的字符串中。 2.布爾值、數(shù)字、字符串的包裝對象在序列化過程中會(huì)自動(dòng)轉(zhuǎn)換成對應(yīng)的原始值。 3.undefined、任意的函數(shù)以及 symbol 值,在序列化過程中會(huì)被忽略(出現(xiàn)在非數(shù)組對象的屬性值中時(shí))或者被轉(zhuǎn)換成 null(出現(xiàn)在數(shù)組中時(shí))。 4.所有以 symbol 為屬性鍵的屬性都會(huì)被完全忽略掉,即便 replacer 參數(shù)中強(qiáng)制指定包含了它們。 5.不可枚舉的屬性會(huì)被忽略 如果一個(gè)被序列化的對象擁有 toJSON 方法,那么該 toJSON 方法就會(huì)覆蓋該對象默認(rèn)的序列化行為:不是那個(gè)對象被序列化,而是調(diào)用 toJSON 方法后的返回值會(huì)被序列化 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
空白字符可以出現(xiàn)在任意位置,但是數(shù)值類型的數(shù)字中間不能有空白字符,字符串中間不能隨意添加空白字符,因?yàn)樘砑拥目瞻鬃址麜?huì)被解釋為相應(yīng)的字符值,從而引起錯(cuò)誤。有效空白字符只包括制表符 (U+0009)、回車符 (U+000D)、換行符 (U+000A) 和空格 (U+0020) 。
JSON.stringify() 方法可以將任意的 JavaScript 值序列化成 JSON 字符串 語法: JSON.stringify(JSvalue [, replacer [, space] ]) ,返回JSON字符串 可選參數(shù)replacer,如果該參數(shù)是一個(gè)函數(shù),則在序列化過程中,被序列化的值的每個(gè)屬性都會(huì)經(jīng)過該函數(shù)的轉(zhuǎn)換和處理;如果該參數(shù)是一個(gè)數(shù)組,則只有包含在這個(gè)數(shù)組中的屬性名才會(huì)被序列化到最終的 JSON 字符串中; 可選參數(shù)space,用來控制結(jié)果字符串里面的間距。如果是一個(gè)數(shù)字, 則在字符串化時(shí)每一級別會(huì)比上一級別縮進(jìn)多這個(gè)數(shù)字值的空格(最多10個(gè)空格);如果是一個(gè)字符串,則每一級別會(huì)比上一級別多縮進(jìn)用該字符串(或該字符串的前十個(gè)字符) var s1 = JSON.stringify({a:1,b:2,c:3,d:4}, ['a','b','c'],'屬性:');
console.log(s1);
/*
{
屬性:"a": 1,
屬性:"b": 2,
屬性:"c": 3
}
*/ 關(guān)于序列化,有下面五點(diǎn)注意事項(xiàng): 1.非數(shù)組對象的屬性不能保證以特定的順序出現(xiàn)在序列化后的字符串中。 2.布爾值、數(shù)字、字符串的包裝對象在序列化過程中會(huì)自動(dòng)轉(zhuǎn)換成對應(yīng)的原始值。 3.undefined、任意的函數(shù)以及 symbol 值,在序列化過程中會(huì)被忽略(出現(xiàn)在非數(shù)組對象的屬性值中時(shí))或者被轉(zhuǎn)換成 null(出現(xiàn)在數(shù)組中時(shí))。 4.所有以 symbol 為屬性鍵的屬性都會(huì)被完全忽略掉,即便 replacer 參數(shù)中強(qiáng)制指定包含了它們。 5.不可枚舉的屬性會(huì)被忽略 如果一個(gè)被序列化的對象擁有 toJSON 方法,那么該 toJSON 方法就會(huì)覆蓋該對象默認(rèn)的序列化行為:不是那個(gè)對象被序列化,而是調(diào)用 toJSON 方法后的返回值會(huì)被序列化 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
空白字符可以出現(xiàn)在任意位置,但是數(shù)值類型的數(shù)字中間不能有空白字符,字符串中間不能隨意添加空白字符,因?yàn)樘砑拥目瞻鬃址麜?huì)被解釋為相應(yīng)的字符值,從而引起錯(cuò)誤。有效空白字符只包括制表符 (U+0009)、回車符 (U+000D)、換行符 (U+000A) 和空格 (U+0020) 。
轉(zhuǎn)載于:https://www.cnblogs.com/susufufu/p/5705800.html
總結(jié)
以上是生活随笔為你收集整理的JavaScript学习笔记-JSON对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android NDK的生命周期JNI_
- 下一篇: 226. Invert Binary T