JSON認識

else發表於2021-09-09

JSON是JavaScript Object Notation的縮寫,它是一種資料交換格式。

JSON實際上是JavaScript的一個子集。在JSON中,一共就這麼幾種資料型別:

  • number:和JavaScript的number完全一致;

  • boolean:就是JavaScript的truefalse

  • string:就是JavaScript的string

  • null:就是JavaScript的null

  • array:就是JavaScript的Array表示方式——[]

  • object:就是JavaScript的{ ... }表示方式。

以及上面的任意組合。

並且,JSON還定死了字符集必須是UTF-8,表示多語言就沒有問題了。為了統一解析,JSON的字串規定必須用雙引號"",Object的鍵也必須用雙引號""

由於JSON非常簡單,很快就風靡Web世界,並且成為ECMA標準。幾乎所有程式語言都有解析JSON的庫,而在JavaScript中,我們可以直接使用JSON,因為JavaScript內建了JSON的解析。

把任何JavaScript物件變成JSON,就是把這個物件序列化成一個JSON格式的字串,這樣才能夠透過網路傳遞給其他計算機。

如果我們收到一個JSON格式的字串,只需要把它反序列化成一個JavaScript物件,就可以在JavaScript中直接使用這個物件了。

序列化

讓我們先把小明這個物件序列化成JSON格式的字串:

var xiaoming = {    name: '小明',    age: 14,    gender: true,    height: 1.65,    grade: null,    'middle-school': '"W3C" Middle School',    skills: ['JavaScript', 'Java', 'Python', 'Lisp']};JSON.stringify(xiaoming); // '{"name":"小明","age":14,"gender":true,"height":1.65,"grade":null,"middle-school":""W3C" Middle School","skills":["JavaScript","Java","Python","Lisp"]}'

要輸出得好看一些,可以加上引數,按縮排輸出:

JSON.stringify(xiaoming, null, '  ');

結果:

{  "name": "小明",  "age": 14,  "gender": true,  "height": 1.65,  "grade": null,  "middle-school": ""W3C" Middle School",  "skills": [    "JavaScript",    "Java",    "Python",    "Lisp"  ]}

第二個引數用於控制如何篩選物件的鍵值,如果我們只想輸出指定的屬性,可以傳入Array

JSON.stringify(xiaoming, ['name', 'skills'], '  ');

結果:

{  "name": "小明",  "skills": [    "JavaScript",    "Java",    "Python",    "Lisp"  ]}

還可以傳入一個函式,這樣物件的每個鍵值對都會被函式先處理:

function convert(key, value) {    if (typeof value === 'string') {        return value.toUpperCase();    }    return value;}JSON.stringify(xiaoming, convert, '  ');

上面的程式碼把所有屬性值都變成大寫:

{  "name": "小明",  "age": 14,  "gender": true,  "height": 1.65,  "grade": null,  "middle-school": ""W3C" MIDDLE SCHOOL",  "skills": [    "JAVASCRIPT",    "JAVA",    "PYTHON",    "LISP"  ]}

如果我們還想要精確控制如何序列化小明,可以給xiaoming定義一個toJSON()的方法,直接返回JSON應該序列化的資料:

var xiaoming = {    name: '小明',    age: 14,    gender: true,    height: 1.65,    grade: null,    'middle-school': '"W3C" Middle School',    skills: ['JavaScript', 'Java', 'Python', 'Lisp'],    toJSON: function () {        return { // 只輸出name和age,並且改變了key:            'Name': this.name,            'Age': this.age        };    }};JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'

反序列化

拿到一個JSON格式的字串,我們直接用JSON.parse()把它變成一個JavaScript物件:

JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}JSON.parse('true'); // trueJSON.parse('123.45'); // 123.45

JSON.parse()還可以接收一個函式,用來轉換解析出的屬性:

JSON.parse('{"name":"小明","age":14}', function (key, value) {    // 把number * 2:    if (key === 'name') {        return value + '同學';    }    return value;}); // Object {name: '小明同學', age: 14}

在JavaScript中使用JSON,就是這麼簡單!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2318/viewspace-2815824/,如需轉載,請註明出處,否則將追究法律責任。