JSON 格式與 JavaScript 解析教學範例
 
                    什麼是 JSON?AJAX 與 JSON 又有什麼關係呢!本篇文章將介紹什麼是 JSON 和應用領域以及如何建立 JSON 格式,並以範例說明如何使用 JavaScript 處理 JSON 教學。
簡介
什麼是 JSON
- JSON (JavaScript 物件表示法)。
- 一種以純文字為基礎,來儲存和交換簡單結構的輕量級【資料交換格式】(類似 XML)。
- 獨立於語言。
- 具有自我描述性,更易於人理解、閱讀和編寫,同時也易於機器解析和生成。
- JSON 比 XML (可延伸標記式語言) 更小、更快且更易解析。
應用領域
JSON 最開始被廣泛的應用於 Web 的開發,隨著 Web 2.0 的方興未艾,JSON 在 Web 資料傳輸領域占有重要的地位。
JSON 因小巧與瀏覽器內建快速解析支援,因此較適用於網路資料傳輸領域,而目前最常用在 AJAX (非同步的 JavaScript 與 XML 技術) 的資料傳輸。
JSON 與 XML 比較
JSON 與 XML 最大的不同在於 XML 是一個完整的標記語言,而 JSON 不是。這使得 XML 在程式判讀上需要比較多的功夫。主要的原因在於 XML 的設計理念與 JSON 不同。XML 利用標記語言的特性提供了絕佳的延展性 (如 XPath),在資料儲存,擴充功能及高階檢索方面具備對 JSON 的優勢,而 JSON 則由於比 XML 更加小巧,以及瀏覽器的內建快速解析支援,使得其更適用於網路資料傳輸領域。
JSON 格式
字串
JSON 字串可以包含 object (物件) 或 array (陣列) 資料,object 與 array 也可互相包含:
{
    "member": [
        { "name": "Jacky" },
        { "name": "Marry" },        
    ]
}物件
- 一個 object 以 {開始,並以}結束,來寫入資料。
- name為 string,必須以- ""括起來。
- name與- value之間使用- :分隔。
- 多個 name:value之間使用,分隔。
{ "name": value, "name": value }陣列
- 一個陣列以 [開始,並以]結束,來寫入資料。
- 多個 value之間使用,分隔。
[value, value]object 和 array 的值
object 和 array 可使用的資料型態與值如下:
{ "array": ["string", 10, 1.0, -1, true, false, null] }| 資料型態 | 值 / 說明 | |
|---|---|---|
| 英文 | 中文 | |
| object | 物件 | {} | 
| array | 陣列 | [] | 
| string | 字串 | ""括起來的內容 (不可使用單個'') | 
| number | 數值 | 0-9 的數字組合 (整數、小數或負數) | 
| boolean | 布林值 | true或false | 
| null | 空值 | null | 
JSON 字串範例
例如一個會員的基本資料,使用 JSON 字串表示如下:
{
     "number": "1020501",
     "name": "小傑",
     "age": 32,
     "sex": "M",
     "interest": [
         "網頁設計",
         "撰寫文章"
     ]
 }JavaScript 處理 JSON
物件序列化成 JSON 字串
JSON.stringify() 可以將 JavaScript 物件序列化成 JSON 字串:
// JavaScript 物件
var member = {
    "number": "1020501",
    "name": "小傑",
    "age": 32,
    "sex": "M",
    "interest": [
        "網頁設計",
        "撰寫文章"
    ]
};
 
console.log(
    JSON.stringify(member)  // 序列化成 JSON 字串
);
 
/* 輸出:
 
{"number":"1020501","name":"小傑","age":32,"sex":"M","interest":["網頁設計","撰寫文章"]}
 */JSON.stringify() 方法可指定第二個參數:
- 如果該參數是一個 function (可接受物件的特性與值,可以自行決定如何轉換為 JSON 字串) 則在序列化過程中,被序列化的值的每個屬性都會經過 function 的轉換和處理,return 值為:- number、- string或- boolean:就會被加入 JSON 字串。
- object:會遞迴呼叫指定的 function 進行轉換。
- undefined:該特性就不會被加入 JSON 字串。
 
- 如果該參數是一個 array,則只有包含在這個 array 中的屬性名才會被序列為 JSON 字串。
// JavaScript 物件
var member = {
    "number": "1020501",
    "name": "小傑",
    "age": 32,
    "sex": "M",
    "interest": [
        "網頁設計",
        "撰寫文章"
    ]
};
 
// 使用第二個參數 function 方式,排除 age 特性不被序列為 JSON 字串
console.log(
    JSON.stringify(member, function(key, value) {
        if (key === "age") return undefined;
 
        return value;
    })
);
 
/* 輸出:
 
{"number":"1020501","name":"小傑","sex":"M","interest":["網頁設計","撰寫文章"]}
 */
// 使用第二個參數 array 方式,指定要被序列為 JSON 字串的特性
console.log(
    JSON.stringify(member, ["number", "name"])
);
 
/* 輸出:
 
{"number":"1020501","name":"小傑"}
 */JSON.stringify() 方法可指定第三個參數,來控制結果字串的縮排間距,並會自動換行:
- 如果是一個【數值】則代表有多少空格 (上限 10、小於 1 則沒有空格)。
- 如果是一個【字串】則該字串將被作為空格。
// JavaScript 物件
var member = {
    "number": "1020501",
    "name": "小傑",
    "age": 32,
    "sex": "M",
    "interest": [
        "網頁設計",
        "撰寫文章"
    ]
};
 
// 使用第三個參數【數值】方式指定縮排
console.log(
    JSON.stringify(member, null, 2)
);
 
/* 輸出:
 
{
  "number": "1020501",
  "name": "小傑",
  "age": 32,
  "sex": "M",
  "interest": [
    "網頁設計",
    "撰寫文章"
  ]
}
 */
// 使用第三個參數【字串】方式指定縮排
console.log(
    JSON.stringify(member, null, "t")
);
 
/* 輸出:
{
t"number": "1020501",
t"name": "小傑",
t"age": 32,
t"sex": "M",
t"interest": [
tt"網頁設計",
tt"撰寫文章"
t]
}
 */JSON 字串解析成 JavaScript 物件
JSON.parse() 方法
JSON.parse() 方法可以將 JSON 字串解析成 JavaScript 物件,這樣就可使用 JavaScript 進行操作了:
// 宣告字串須使用 '' 括起來,否則就會變成是 JavaScript object 了
// 如在不同行必須在每行結尾處加上 \,否則會產生 SyntaxError
var jsonString = '{ \
    "number": "1020501", \
    "name": "小傑", \
    "age": 32, \
    "sex": "M", \
    "interest": [ \
        "網頁設計", \
        "撰寫文章" \
    ] \
}';
 
// 將 JSON 字串解析成 JavaScript 值,這樣就可使用 JavaScript 進行操作了
var member = JSON.parse(jsonString);
 
// 取得物件的指定值
console.log(
    member.name + ', ' +
    member.interest[0]
);
 
/* 輸出:
 
小傑, 網頁設計
 */JSON.parse() 方法可指定第二個參數 function 用來轉換解析出的屬性值,return 的值決定最後在物件上的特性值;若 return 的值為 undefined,就不會包括該特性:
// 宣告字串須使用 '' 括起來,否則就會變成是 JavaScript Object 了
// 如在不同行必須在每行結尾處加上 \,否則會產生 SyntaxError
var jsonString = '{ \
    "number": "1020501", \
    "name": "小傑", \
    "age": 32, \
    "sex": "M", \
    "interest": [ \
        "網頁設計", \
        "撰寫文章" \
    ] \
}';
 
// 使用第二個參數 function 方式,排除 age 特性不被包括在物件
var member = JSON.parse(jsonString, function(key, value) {
    if (key === "age") return undefined;
 
    return value;
});
 
// 取得物件
console.log(member);
 
/* 輸出:
 
Object {number: "1020501", name: "小傑", sex: "M", interest: ["網頁設計", "撰寫文章"]}
 */eval() 函式
eval() 函式可以將一個 JavaScript 代碼字串求值成特定的物件。字串前後須加上刮號 eval("(" + string + ")"),用來告知 Javascript 這是個物件描述,而不是要執行的 statement:
eval() 函式可執行字串中的 Javascript 程式碼,所以容易有 XSS 攻擊的危險,因此較不建議使用 。eval() 函式可相容較舊版本的瀏覽器。// 宣告字串須使用 '' 括起來,否則就會變成是 JavaScript object 了
// 如在不同行必須在每行結尾處加上 \ 告知這是接續下一行,否則會產生 SyntaxError
var jsonString = '{ \
    "number": "1020501", \
    "name": "小傑", \
    "age": 32, \
    "sex": "M", \
    "interest": [ \
        "網頁設計", \
        "撰寫文章" \
    ] \
}';
 
// 使用 eval() 將字串求值成特定的物件 (字串前後須加上刮號,用來告知這不是要執行的 statement),這樣就可使用 JavaScript 進行操作了
var member = eval("(" + jsonString + ")");
 
// 取得物件的指定值
console.log(
    member.name + ', ' +
    member.interest[0]
);
 
/* 輸出:
 
小傑, 網頁設計
 */走訪 (遍歷) JavaScript object 和 array
個別使用 JavaScript for() 與 jQuery each() 兩種方式,在走訪(遍歷)時,將資料帶入 HTML table (表格)。
使用 JavaScript for()
HTML:
<table class="for-table" border="1">
    <thead>
        <tr>
            <th>姓名</th>
            <th>年齡</th>
        </tr>
    </thead>
    <tbody></tbody>
</table>JavaScript:
var json = [{ "name": "小傑", "age": 32 },
            { "name": "小明", "age": 28 }];
var forTable = document.querySelector('.for-table tbody');
 
for (var i = 0, len = json.length; i < len; i++) {
    forTable.innerHTML += 
        '<tr>' +
            '<td>' + json[i].name + '</td>' +
            '<td>' + json[i].age + '</td>' +
        '</tr>';
}| 姓名 | 年齡 | 
|---|---|
| 小傑 | 32 | 
| 小明 | 28 | 
使用 jQuery each()
HTML:
<table class="each-table" border="1">
    <thead>
        <tr>
            <th>姓名</th>
            <th>年齡</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>JavaScript:
var json = [{ "name": "小傑", "age": 32 },
            { "name": "小明", "age": 28 }];
var eachTable = $('.each-table tbody');
 
$.each(json, function(index, element) {
    eachTable.append(
        '<tr>' +
            '<td>' + element.name + '</td>' +
            '<td>' + element.age + '</td>' +
        '</tr>');
});
| 姓名 | 年齡 | 
|---|---|
| 小傑 | 32 | 
| 小明 | 28 | 
參考
 
                            本著作係採用創用 CC 姓名標示-相同方式分享 3.0 台灣 授權條款授權.
 
                                    
                                
您好,我在cmd可順利的將json物件內容作換行,結果如下
[
{
"booktitle": "Leading",
"bookid": "56353",
"bookauthor": "Sir Alex Ferguson"
},
{
"booktitle": "How Google Works",
"bookid": "73638",
"bookauthor": "Eric Smith"
},
{
"booktitle": "The Merchant of Venice",
"bookid": "37364",
"bookauthor": "William Shakespeare"
}
]
PS D:WorkspaceExcel2JsonTestexcel-to-json-in-Node.js> node app.js
running on 3000...
uploadsfile-1513237256061.xlsx
[
{
"booktitle": "Leading",
"bookid": "56353",
"bookauthor": "Sir Alex Ferguson"
},
{
"booktitle": "How Google Works",
"bookid": "73638",
"bookauthor": "Eric Smith"
},
{
"booktitle": "The Merchant of Venice",
"bookid": "37364",
"bookauthor": "William Shakespeare"
}
]
但是要在網頁頁面呈現時,用相同的方卻無法換行,得到的結果如下
"[n {n "booktitle": "Leading",n "bookid": "56353",n "bookauthor": "Sir Alex Ferguson"n },n {n "booktitle": "How Google Works",n "bookid": "73638",n "bookauthor": "Eric Smith"n },n {n "booktitle": "The Merchant of Venice",n "bookid": "37364",n "bookauthor": "William Shakespeare"n }n]"
請問造成上述結果的原因為何?
1. 因為換行就是以符號 n 表示,不用特別換行。
2. 盡量別自行串接 JSON、XML 等等資料交換格式,建議使用程式預設提供的函數,如 PHP 就有提供 json_encode() 與 json_decode() 將陣列編、解碼成 JSON,方便又能減少出錯率。
你最后的JSON格式好像有问题?
JSON虽然非常好用,但是也有一个缺点,就是比较长的时候格式容易出错而且不好排查,出现了问题可以先看看JSON本身的格式是不是出现了问题
你可以用一些在线工具排查 https://www.jsonformatting.com/