在本教程中,您将學習什麼是JSON以及如何在JavaScript和Node.js中使用它。
介紹
在後端和前端之間交換資料的最流行的格式之一是JSON,它用來表示JavaScript對象。它與正常JavaScript對象的外觀非常相似,但也有其獨特之處。它的讀音為“ jason”或“ jay-sun”,是以您可能會聽到一些不同的發音。
JSON對其使用的程式設計語言沒有任何限制。您可以在這樣的組織中工作:有些後端服務是用Python編寫的,有些後端是Java的,前端是JS的,它們都可以完美地交換JSON消息。
以JSON格式存儲資料
首先JSON是一個字元串。這允許在需要時進行非常有效的資料壓縮。缺點是我們無法存儲循環資料結構,例如,引用自身的對象。
(幾乎)所有内容都應使用引号引起來
與JavaScript不同,您隻應使用雙引号并将所有對象屬性包裝在其中。您不能使用單引号或反引号。
在JS中,我們有一個像這樣的對象
{
name: 'Jack',
isMarried: false,
age: 25,
}
而在JSON中,它将變成
{
"name": "Jack",
"isMarried": false,
"age": 25
}
請注意:在JavaScript對象中,在逗号後出現逗号age: 25,是可以接受的,但在JSON中則是不允許的。
所有字段名稱都用雙引号引起來,但并非所有原始值都使用雙引号引起來。數字和布爾值不帶引号存儲。
對象存儲在花括号中
像在JS中一樣,花括号用于存儲對象。
請注意,如果伺服器以JSON格式響應,則期望它以對象響應。您不能隻列出這些字段。它們都需要用大括号括起來才能成為JSON對象。
數組存儲在方括号中
一切都與JS中完全一樣,我們将數組的名稱用雙引号引起來,并且數組本身在方括号中表示。
{
"pets": ["Rex", "Sandy"]
}
再次注意,該行的末尾沒有逗号或分号。
所有JSON對象資料都存儲為"key": “value”(“鍵”:“值”)對
與JS中一樣,您隻能将對添加key:value到對象。如果需要存儲多個不帶鍵的值,則需要一個數組。
将JavaScript對象轉換為JSON并傳回
要将正常JS對象轉換為JSON字元串,您需要此JSON.stringify(obj)函數。無需安裝其他子產品即可使用。您向其傳遞一個對象,obj并獲得一個JSON對象作為輸出。
const user = {
name: 'Jack',
isMarried: false,
age: 25,
}
const userJSON = JSON.stringify(user);
console.log(userJSON); // {"name": "Jack", "isMarried": false, "age": 25}
要從JSON轉換為正常對象,我們需要JSON.parse(s)函數。我們以JSON格式的字元串作為輸入,并傳回一個普通的JS對象。
const jsonString = '{"name": "Jack", "isMarried": false, "age": 25}';
const parsedUser = JSON.parse(jsonString);
console.log(parsedUser); // {name: 'Jack', isMarried: false, age: 25}
Express.js和JSON
如果您不熟悉Express,我将在後續的文章為您講解:
如何建立Express伺服器
快速中間件和外部通路
由于我們知道JSON對象是一個字元串,是以我們可以非常輕松地修改伺服器并發送一些對象而不是Hello, Express.js。
假設我們需要将一個對象傳遞給前端
{
name: 'Hero',
isLearning: true,
level: 'apprentice',
}
我們将通過幾種方式來做到這一點。在所有情況下,前端都會收到相同的内容,您可以在浏覽器中通過請求進行驗證。
普通字元串:
server.get('/', (req, res) => {
return res.send('{"name": "Hero", "isLearning": true, "level": "apprentice"}');
})
對象轉換為JSON.stringify:
const user = { name: 'Hero', isLearning: true, level: 'apprentice' };
對象轉換為res.json:
server.get('/', (req, res) => {
const user = { name: 'Hero', isLearning: true, level: 'apprentice' };
return res.json(user);
})
我會重複一遍。在所有情況下,結果都是相同的。我們發送狀态為200和字元串的響應,{"name": "Hero", "isLearning": true,"level": "apprentice"}收件人可以根據需要使用該字元串。
老實說,res.send和res.json之間存在細微差别。如果使用,并且選擇,則會設定 一個特殊的标頭Content-Type。text/htmlres.sendapplication/jsonres.json
res.json如果您有想要以JSON格式發送的對象,則使用此屬性。
第三個示例是最友善的示例,因為我們不執行任何不必要的操作。我們将對象傳遞給,res.json并在内部進行到JSON字元串的轉換。JSON.stringify在這種情況下,不需要像示例2一樣對進行額外的(顯式)調用。
最後給大家分享一個學習全棧JavaScript的網站:
https://js.coderslang.com/比較生動有趣的帶入性學習
