JSON反序列化

2022-03-15 19:00:18
JSON 反序列化即將 JSON 字串轉換為 JSON 物件的過程,得到的結果用於在 JavaScript 中做邏輯處理。

JSON 反序列化的實現方式有兩種,一種是使用 JSON 物件內建的 parse() 函數,一種是使用 eval() 函數。

JSON.parse() 函數

JSON.parse() 函數用來解析 JSON 字串,構造由字串描述的 JavaScrip t值或物件,它的語法如下所示:

JSON.parse(text[, reviver])

其中各個引數的含義如下:

  • text 表示待解析的 JSON 字串。
  • reviver 是一個可選引數。如果是一個函數,則規定了原始值在返回之前如何被解析改造。如果被解析的 JSON 字串是非法的,則會丟擲異常。

我們首先來看看 JSON.parse() 函數的基本使用方法,包括對陣列、物件、基本資料型別的處理。
JSON.parse('[1,2,3,true]');         // Array [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45
JSON.parse() 函數還可以接收一個函數,用來處理 JSON 字串中的每個屬性值。當屬性值為一個陣列或者物件時,陣列中的每個元素或者物件的每個屬性都會經過 reviver 引數對應的函數處理。執行的順序是從最內層開始,按照層級順序,依次向外遍歷。

我們通過以下這段程式碼看看 parse() 函數傳遞 reviver 引數的處理情況:

首先定義 JSON 字串,然後呼叫 JSON.parse() 函數進行解析。
var jsonStr = '{"name":"kingx","age":15,"address":"北京市","interest":["basketball",
"football"],"children":[{"name":"kingx2","age":20}],"email":"[email protected]"}';

var result = JSON.parse(jsonStr, function (key, value) {
    if (key === 'name') {
        return value + '同學';
    }
    if (key === 'age') {
        return value * 2;
    }
    return value;
});

console.log(result);
輸出的結果如下所示:
{
    name: 'kingx同學',
    age: 30,
    address: '北京市',
    interest: ['basketball', 'football'],
    children: [{
        name: 'kingx2同學',
        age: 40
    }],
    email: '[email protected]'
}
通過結果可以看出,解析後的 name 屬性的值都加上了“同學”,age 屬性的值都乘以了 2。當使用 JSON.parse() 函數解析 JSON 字串時,需要注意兩點:

  • JSON 字串中的屬性名必須用雙引號括起來,否則會解析錯誤。

以下是一些正確和錯誤的寫法:
var json = '{"name":"kingx"}'; // 這個是正確的JSON格式

var json = "{\"name\":\"kingx\"}"; // 這個也是正確的JSON格式

var json = '{name:"kingx"}'; // 這個是錯誤的JSON格式,因為屬性名沒有用雙引號括起來

var json = "{'name':'kingx'}"; //這個也是錯誤的JSON格式,屬性名應該用雙引號括起來,而它用了單引號

  • JSON字串不能以逗號結尾,否則會解析異常。
JSON.parse("[1, 2, 3, 4, ]"); // 解析異常,陣列最後一個元素後面出現逗號
JSON.parse('{"foo" : 1, }'); // 解析異常,最後一個屬性值後面出現逗號

eval()函數

eval() 函數用於計算 JavaScript 字串,並把它作為指令碼來執行。

在使用 eval() 函數進行 JSON 反序列化時,其語法如下所示:

eval("(" + str + ")")

其中,str 表示待處理的字串。

這裡為什麼要使用括號將拼接出來的字串括起來呢?

因為 JSON 字串是以“{}”開始和結束的,在 JavaScript 中它會被當作一個語句塊來處理,所以必須強制將它處理成一個表示式,所以採用括號。
var json1 = '{"name":"kingx"}';
var json2 = '{"address":["beijing","shanghai"]}';
console.log(eval("(" + json1 + ")"));// {name: "kingx"}
console.log(eval("(" + json2 + ")"));// {address: ["beijing", "shanghai"]}