JSON介紹

JSON是一種儲存和交換資料的優良格式,廣泛用於JavaScript但不僅限於此-了解一切有關它的知識! JSON是一種文件格式,用於儲存和交換資料。 資料以鍵值對的形式儲存。 JSON格式易於人類閱讀,非常適合手動編輯。 這是一個JSON字符串的例子: { "name": "Flavio", "age": 35 } 從這個小片段中,你可以看到鍵被包裹在雙引號中,冒號分隔鍵和值,值可以是不同的類型。 鍵值對之間用逗號分隔。 在JSON文件中,間距(空格、制表符、換行)不重要。上述示例等同於 {"name": "Flavio","age": 35} 或 {"name": "Flavio","age": 35} 但像一直以來,格式良好的資料更容易理解。 JSON誕生於2002年,由於易於使用和靈活性而迅速流行起來,儘管它起源於JavaScript,但很快就擴展到其他編程語言中。 它在ECMA-404標準中有所描述。 JSON字符串通常存儲在.json文件中,並以application/json的MIME類型在網絡上傳輸。 數據類型 JSON支援一些基本數據類型: Number:不帶引號的任意數字 String:用引號包裹的任意字符集 Boolean:true或false Array:用方括號包裹的值列表 Object:用大括號包裹的鍵值對集合 null:表示空值的單詞null 其他任何數據類型都必須被序列化為字符串(然後反序列化)才能存儲在JSON中。 在JavaScript中編碼和解碼JSON ECMAScript 5於2009年在JavaScript標準中引入了JSON對象,該對象提供了JSON.parse()和JSON.stringify()方法,此外還有其他功能。 在JavaScript程序中使用JSON字符串之前,必須將其解析並轉換為JavaScript可以使用的數據。 JSON.parse()將JSON字符串作為參數,並返回包含解析後JSON的對象: JSON.parse(string) JSON.stringify()將JavaScript對象作為參數,並返回表示其為JSON的字符串: JSON.stringify(object) JSON.parse()還可以接受可選的第二個參數,稱為解析器函數。您可以使用它來進行解析並執行任何自定義操作: JSON.parse(string, (key, value) => { if (key === 'name') { return `Name: ${value}` } else { return value } }) 嵌套對象 您可以使用嵌套對象來組織JSON文件中的數據: { "name": { "firstName": "Flavio", "lastName": "Copes" }, "age": 35, "dogs": [ { "name": "Roger" }, { "name": "Syd" } ], "country": { "details": { "name": "Italy" } } } 用於處理JSON的在線工具...

npm 可以在父文件夹中安裝套件

了解如何解決使用 npm 安裝套件時可能遇到的問題 我在我的編程訓練營中遇到一些學生遇到了這個問題,這是我從未注意到的。 這是由於在空文件夾中安裝套件時 npm 的行為所導致的。 我建議使用 npm install <套件名稱> 來安裝套件,比如: npm install my-prime 在一個空文件夾中安裝。 默認情況下,這會創建一個 package.json 文件,將套件作為依賴添加到其中,創建一個 package-lock.json 文件,並將套件安裝在 node_modules 文件夾中。 但是有一些人沒有看到這種情況發生。似乎什麼都沒發生。 事實上發生的是,他們在父文件夾中有一個 package.json 文件和一個 node_modules 文件夾。 也許不僅僅在父文件夾中,而是在更高的文件夾層級中。 也許他們在家目錄下運行了 npm install <套件> 但沒有意識到,可能是為了測試。 npm 會遍歷整個文件夾樹,檢查是否存在包含 package.json 文件或 node_modules 文件夾的文件夾。如果找到這樣的文件夾,則該文件夾將被視為運行 npm 命令的「當前目錄」。 來源 要解決這個問題,最好的解決方法是刪除父文件夾中的 package.json 和 node_modules 文件夾。 這可能是一個錯誤。 另外,您還可以在文件夾中運行 npm init -y 命令,以創建一個空白的 package.json 文件,然後重新運行 npm install <套件> 命令,這時將會按預期運行。

使用 Express 發送 JSON 回應

如何使用 Node.js 的 Express 函式庫來提供 JSON 資料 當在 Express 上監聽連線時,每個網路呼叫都會呼叫回呼函式並傳入一個 Request 物件實例與一個 Response 物件實例。 範例: app.get('/', (req, res) => res.send('Hello World!')) 在這個例子中,我們使用了 Response.send() 方法,該方法接受任何字串。 你可以使用 Response.json() 方法將 JSON 資料傳送給客戶端,這是一個非常有用的方法。 它接受一個物件或陣列,並在傳送之前將其轉換為 JSON 格式: res.json({ username: 'Flavio' })

在Express中如何獲取解析後的body和原始body

了解如何在Express中使用body-parser獲取解析後的body和原始body。 在我正在構建的某個應用程序中,我遇到了這個問題。 使用Express,我可以導入body-parser來將body解析為JSON: import bodyParser from 'body-parser' app.use(bodyParser.json()) 然而,為了與Stripe支付API集成,我需要將原始body(未解析)暴露給一個端點,但我無法找出如何在解析body為JSON的同時實現這一點。 下面的代碼可以解決這個問題: app.use(bodyParser.json({ verify: (req, res, buf) => { req.rawBody = buf } })) 現在可以通過req.rawBody獲取原始body,並且通過req.body獲取JSON解析後的數據。 從body-parser的GitHub上我發現,這將使每次請求的RAM使用量翻倍,但由於我需要這個功能,我別無選擇。 除非為我想處理的Stripe webhook創建一個不同的伺服器。

在Node.js中解析JSON

如何從字符串解析JSON,以及如何在Node.js中讀取JSON文件 如果您有一個字符串作為一部分的JSON數據,最好的方法是使用JavaScript標準的JSON.parse方法來解析數據。自ECMAScript 5以來,這個方法已經提供給V8,這是Node.js所使用的JavaScript引擎。 示例: const data = '{ "name": "Flavio", "age": 35 }' try { const user = JSON.parse(data) } catch(err) { console.error(err) } 請注意,JSON.parse是同步的,所以JSON文件越大,你的程序執行時間也會越長,因為需要阻塞程序執行直到解析完成。 你可以通過將其放在一個promise和setTimeout調用中,以異步方式處理JSON。這確保解析在事件循環的下一次迭代中進行。 const parseJsonAsync = (jsonString) => { return new Promise(resolve => { setTimeout(() => { resolve(JSON.parse(jsonString)) }) }) } const data = '{ "name": "Flavio", "age": 35 }' parseJsonAsync(data).then(jsonData => console.log(jsonData)) 如果您的JSON數據是存在文件中的,您首先需要讀取它。 一種非常簡單的方法是使用require(): const data = require('./file.json') 由於你使用了.json擴展名,所以require()足夠聰明,會自動解析JSON數據到data對象中。 唯一的一個缺點是文件讀取是同步的方式進行的。此外,require()的結果會被緩存,所以如果您因為更新了文件而再次調用它,直到程序退出之前,您將無法獲取新的內容。 這個功能用於使用JSON文件作為應用程序配置的一部分,這是一個完全有效的使用場景。 您還可以手動讀取文件,使用fs.readFileSync: const fs = require('fs') const fileContents = fs....

如何修復Algolia上的\"objectID required\"錯誤

我使用Algolia來提供這個部落格的搜尋功能。 我會不定期地通過特定網站的特殊網址下載我預先準備好的JSON文件,然後手動通過Algolia的控制面板上傳它。 這其實是可以自動化的,但偶爾手動上傳一次也沒有太大問題。 今天,在上傳JSON文件時,我遇到了以下的錯誤: 上傳錯誤:使用action=updateObject時,'objectID'屬性是必需的 我在VS Code中檢查這個JSON文件後發現有一個項目的"objectID": ""。 我刪除了這個項目後,上傳成功了。

如何修復在 Next.js 中序列化日期對象的 JSON 錯誤

了解在返回包含日期對象的對象時,在 Next.js 中出現 JSON 可序列化錯誤的原因,以及如何修復它。 如果您使用 Next.js 與數據庫,您肯定會遇到這樣的問題。 您在 getServerSideProps() 或 getStaticProps() 中獲取一些數據,例如這樣使用 Prisma: export async function getServerSideProps() { let cars = await prisma.car.findMany() return { props: { cars, }, } } 現在,如果數據庫表中包含一個包含日期的字段,該字段在 JavaScript 中被轉換為 Date 對象,您將收到如下錯誤: 這是因為您必須返回一個可 JSON 序列化的對象。Date 對象無法直接轉換為 JSON。 在這種情況下,解決方案可以非常簡單,如下所示: export async function getServerSideProps() { let cars = await prisma.car.findMany() cars = JSON.parse(JSON.stringify(cars)) return { props: { cars, }, } } 這將把 Date 對象轉換為字符串。 我喜歡這種解決方案,因為它顯而易見,可見且不具侵入性。 另一個解決方案是使用一個名為 superjson 的庫和它的 Next....

如何在Node.js中將JSON物件寫入檔案

了解如何在Node.js中將JSON物件儲存到檔案中,並在之後檢索它。 有時,在Node.js應用程式中,將資料儲存到檔案系統中是最好的方法。 如果您有一個可以序列化為JSON的物件,您可以使用JSON.stringify()方法和fs模組的fs.writeFileSync()方法,它同步將資料寫入檔案中: const fs = require('fs'); const storeData = (data, path) => { try { fs.writeFileSync(path, JSON.stringify(data)); } catch (err) { console.error(err); } }; 要檢索資料,可以使用fs.readFileSync()方法: const loadData = (path) => { try { return fs.readFileSync(path, 'utf8'); } catch (err) { console.error(err); return false; } }; 我們使用了同步的API,所以一旦獲取資料,就可以輕鬆地返回它。 您也可以選擇使用非同步版本的fs.writeFile和fs.readFile,雖然程式碼會有些變化,我建議您參考如何使用Node.js寫入檔案和如何使用Node.js讀取檔案來了解更多資訊。

如何解决“TypeError: Attempted to assign to readonly property”错误

在我的 Next.js 代码库中,我遇到了这个问题: TypeError: Attempted to assign to readonly property 奇怪!经过一番调试,我找到了问题所在。它与 Next.js 无关,它可以发生在任何 JavaScript 代码库中。 在我的数据库中,有一列是以 JSON 的形式存储数据。 在我的代码中,我使用点语法(例如 data.name = 'Flavio')来更新这个 JSON 对象,但是我忘记在此之前调用 JSON.parse()。 data 不是一个对象,而是一个字符串! 在 JavaScript 中,字符串是不可变的。一旦定义,我们无法更新它们。因此会出现错误。解决方法很简单,就是在更新 JSON 对象之前调用 JSON.parse()。

應用程式總是需要一個資料庫嗎?

關於資料庫需求的一些想法。也許你需要它,也許不需要。 應用程式總是需要一個資料庫嗎?當然不是。 就像科技中的一切一樣,在每個情況下都沒有一個理想的解決方案。 電腦提供了許多不同的資料儲存方式。最明顯的替代方案是檔案。 一個常見的例子是內容管理系統(CMS)。有些CMS使用資料庫來儲存資料(比如WordPress),有些則更偏好使用檔案來儲存資料(比如Grav或Statamic)。 在這種情況下不使用資料庫意味著更簡單的部署到一個虛擬主機服務上。 但是當處理大量資料時,資料庫絕對是簡化長期生活的好方法。 如果您正在開發一個macOS或iOS應用程式,您可能會決定只需要一個JSON或Plist檔案來處理資料,因為使用者不需要儲存大量資料。 或者可能Core Data(內部SQLite資料庫的封裝)對您來說是最適合的選擇。 總之,它始終是復雜性與便利性的平衡。