JSON Stringify 示例 |
您所在的位置:网站首页 › JS加载JSON到selete › JSON Stringify 示例 |
原文:JSON Stringify Example – How to Parse a JSON Object with JS,作者:Kris Koishigawa JSON,即JavaScript对象符号(JavaScript Object Notation),我们常常会用到它。如果你曾经使用过一个网络应用,它很有可能使用JSON在其服务器和你的设备之间构建、存储和传输数据。 在这篇文章中,我们将简要介绍JSON和JavaScript的区别,然后跳到在浏览器和Node.js项目中用JavaScript解析JSON的不同方法。 JSON和JavaScript之间的区别虽然JSON看起来像普通的JavaScript,但最好把JSON看作一种数据格式,类似于文本文件。恰好JSON的灵感来自于JavaScript语法,这就是为什么它们看起来如此相似。 让我们来看看JSON对象和JSON数组,并将它们与它们的JavaScript对应物进行比较。 JSON对象与JavaScript对象字面意义(Object Literals)首先,这里有一个JSON对象: { "name": "Jane Doe", "favorite-game": "Stardew Valley", "subscriber": false }jane-profile.json JSON对象和普通的JavaScript对象(也叫对象字面 object literal)的主要区别在于引号。JSON对象中的所有键和字符串类型的值都必须用双引号(")来包裹。 JavaScript对象字面意义更灵活一些。对于对象字面意义,你不需要用双引号来包裹键和字符串。相反,你可以使用单引号('),或者不对键值使用任何类型的引号。 下面是上面的代码作为一个JavaScript对象字面: const profile = { name: 'Jane Doe', 'favorite-game': 'Stardew Valley', subscriber: false }注意,键"'favorite-game'"是用单引号包裹的。对于对象字面,你需要用引号来包装那些由破折号(-)分隔的字的键。 如果你想避免引号,你可以重写键,使用骆驼字母大小写(favoriteGame),或者用下划线来分隔单词(`favorite_game')。 JSON数组 .vs. JavaScript数组JSON数组的工作方式与JavaScript中的数组基本相同,可以包含字符串、布尔值、数字和其他JSON对象。比如说: [ { "name": "Jane Doe", "favorite-game": "Stardew Valley", "subscriber": false }, { "name": "John Doe", "favorite-game": "Dragon Quest XI", "subscriber": true } ]profiles.json 下面是在普通JavaScript中可能出现的情况: const profiles = [ { name: 'Jane Doe', 'favorite-game': 'Stardew Valley', subscriber: false }, { name: 'John Doe', 'favorite-game': 'Dragon Quest XI', subscriber: true } ]; JSON作为一个字符串你可能会想,如果有JSON对象和数组,你就不能在你的程序中像普通的JavaScript对象字面或数组一样使用它吗? 不能这样做的原因是,JSON实际上只是一个字符串。 例如,当你在一个单独的文件中写JSON时,如上面的jane-profile.json或profiles.json,该文件实际上包含了JSON对象或数组形式的文本,它恰好看起来像JavaScript。 如果你向API发出请求,它将返回类似这样的东西: {"name":"Jane Doe","favorite-game":"Stardew Valley","subscriber":false}就像文本文件一样,如果你想在你的项目中使用JSON,你需要把它解析或改变成你的编程语言可以理解的东西。例如,在Python中解析一个JSON对象将创建一个字典。 有了这种理解,让我们看看在JavaScript中解析JSON的不同方法。 如何在浏览器中解析JSON如果你在浏览器中使用JSON,你可能是通过API接收或发送数据。 让我们看一下几个例子。 如何用fetch解析JSON从API获取数据的最简单方法是使用fetch,它包括.json()方法,将JSON响应自动解析为可用的JavaScript对象字面或数组。 下面是一些代码,使用 fetch 从对一个对开发者免费的 Chuck Norris Jokes API平台,发出 GET 请求: fetch('https://api.chucknorris.io/jokes/random?category=dev') .then(res => res.json()) // the .json() method parses the JSON response into a JS object literal .then(data => console.log(data));如果你在浏览器中运行这段代码,你会看到像这样的东西记录在控制台中: { "categories": ["dev"], "created_at": "2020-01-05 13:42:19.324003", "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png", "id": "elgv2wkvt8ioag6xywykbq", "updated_at": "2020-01-05 13:42:19.324003", "url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq", "value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris." }虽然这看起来像一个JSON对象,但它实际上是一个JavaScript对象字面,你可以在你的程序中自由使用它。 如何用JSON.stringify()对JSON进行字符串化处理但是,如果你想把数据发送到API呢? 例如,假设你想发送一个 Chuck Norris 的joke 到 Chuck Norris Jokes API,以便其他人以后可以阅读它。 首先,你要把 joke 写成一个JS对象的字面意思: const newJoke = { categories: ['dev'], value: "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command." };然后,由于你要向API发送数据,你需要把你的newJoke对象字面意思变成一个JSON字符串。 幸运的是,JavaScript包含了一个超级有用的方法来做到这一点-JSON.stringify(): const newJoke = { categories: ['dev'], value: "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command." }; console.log(JSON.stringify(newJoke)); // {"categories":["dev"],"value":"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."} console.log(typeof JSON.stringify(newJoke)); // string虽然我们在这个例子中把一个对象的字面意思转换成JSON字符串,但是JSON.stringify()也适用于数组。 最后,你只需要用POST请求将你的JSON字符串化的 joke 送回给API。 请注意,Chuck Norris joke API 实际上并没有这个功能。但是,如果它有的话,下面是代码可能会出现的情况: const newJoke = { categories: ['dev'], value: "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command." }; fetch('https://api.chucknorris.io/jokes/submit', { // fake API endpoint method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(newJoke), // turn the JS object literal into a JSON string }) .then(res => res.json()) .then(data => console.log(data)) .catch(err => { console.error(err); });就这样,你用fetch解析了传入的JSON,并使用JSON.stringify()将JSON对象字面意思转换成JSON字符串。 如何在浏览器中处理本地JSON文件不幸的是,在浏览器中加载一个本地JSON文件是不可能的(或者说是不可取的)。 如果你试图加载一个本地文件,fetch将抛出一个错误。例如,假设你有一个JSON文件,里面有一些 jokes: [ { "categories": ["dev"], "created_at": "2020-01-05 13:42:19.324003", "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png", "id": "elgv2wkvt8ioag6xywykbq", "updated_at": "2020-01-05 13:42:19.324003", "url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq", "value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris." }, { "categories": ["dev"], "created_at": "2020-01-05 13:42:19.324003", "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png", "id": "ae-78cogr-cb6x9hluwqtw", "updated_at": "2020-01-05 13:42:19.324003", "url": "https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw", "value": "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris." } ]jokes.json 而你想解析它并在一个简单的HTML页面上创建一个 jokes 列表。 如果你用以下内容创建一个页面并在浏览器中打开它: Fetch Local JSON fetch("./jokes.json", { mode: "no-cors" }) // disable CORS because path does not contain http(s) .then((res) => res.json()) .then((data) => console.log(data));index.html 你会在控制台中看到这个: Fetch API cannot load file:///jokes.json. URL scheme "file" is not supported默认情况下,出于安全考虑,浏览器不允许访问本地文件。这是一件好事,你不应该试图绕过这种行为。 相反,最好的办法是将本地的JSON文件转换成JavaScript。幸运的是,这很容易,因为JSON的语法与JavaScript非常相似。 你所需要做的就是创建一个新的文件并将你的JSON声明为一个变量: const jokes = [ { "categories": ["dev"], "created_at": "2020-01-05 13:42:19.324003", "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png", "id": "elgv2wkvt8ioag6xywykbq", "updated_at": "2020-01-05 13:42:19.324003", "url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq", "value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris." }, { "categories": ["dev"], "created_at": "2020-01-05 13:42:19.324003", "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png", "id": "ae-78cogr-cb6x9hluwqtw", "updated_at": "2020-01-05 13:42:19.324003", "url": "https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw", "value": "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris." } ]jokes.js 并把它作为一个单独的脚本添加到你的页面上: Fetch Local JSON console.log(jokes);你将能够在你的代码中自由使用jokes数组。 你也可以使用 JavaScript modules 来做同样的事情,但这有点超出了本文的范围。 但如果你想处理本地的JSON文件,并安装了Node.js,该怎么办?让我们现在来看看如何做到这一点。 如何在Node.js中解析JSONNode.js是一个JavaScript运行时,允许你在浏览器之外运行JavaScript。你可以在这里阅读关于 Node.js 的所有内容。 无论你是使用Node.js在你的电脑上本地运行代码,还是在服务器上运行整个网络应用,知道如何处理JSON都是很好的。 在下面的例子中,我们将使用同一个jokes.json文件: [ { "categories": ["dev"], "created_at": "2020-01-05 13:42:19.324003", "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png", "id": "elgv2wkvt8ioag6xywykbq", "updated_at": "2020-01-05 13:42:19.324003", "url": "https://api.chucknorris.io/jokes/elgv2wkvt8ioag6xywykbq", "value": "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris." }, { "categories": ["dev"], "created_at": "2020-01-05 13:42:19.324003", "icon_url": "https://assets.chucknorris.host/img/avatar/chuck-norris.png", "id": "ae-78cogr-cb6x9hluwqtw", "updated_at": "2020-01-05 13:42:19.324003", "url": "https://api.chucknorris.io/jokes/ae-78cogr-cb6x9hluwqtw", "value": "There is no Esc key on Chuck Norris' keyboard, because no one escapes Chuck Norris." } ]jokes.json 如何用require()解析一个JSON文件让我们从最简单的方法开始。 如果你有一个本地的JSON文件,你需要做的就是使用require()来加载它,就像其他Node.js模块。: const jokes = require('./jokes.json');JSON文件将自动为你解析,你可以开始在你的项目中使用它: const jokes = require('./jokes.json'); console.log(jokes[0].value); // "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."注意,这是同步的,意味着你的程序将停止,直到它解析了整个文件才继续。真正大的JSON文件会导致你的程序变慢,所以要小心处理。 另外,因为用这种方式解析JSON会将整个文件加载到内存中,所以最好对静态JSON文件使用这种方法。如果JSON文件在你的程序运行时发生了变化,你将无法获得这些变化,直到你重新启动你的程序并解析更新的JSON文件。 如何用fs.readFileSync()和JSON.parse()来解析JSON文件这是在Node.js项目中解析JSON文件的比较传统的方式(因为缺乏更好的术语)--用fs(文件系统)模块读取文件,然后用JSON.parse()进行解析。 让我们看看如何用fs.readFileSync()方法做到这一点。首先,将fs模块添加到你的项目中: const fs = require('fs');然后,创建一个新的变量来存储jokes.json文件的输出,并设置它等于fs.readFileSync(): const fs = require('fs'); const jokesFile = fs.readFileSync();fs.readFileSync()需要几个参数。第一个是你想要读取的文件的路径: const fs = require('fs'); const jokesFile = fs.readFileSync('./jokes.json');但如果你现在把jokesFile记录到控制台,你会看到这样的东西: 这只是意味着fs模块正在读取文件,但它不知道文件的编码或格式。fs可以用来加载几乎任何文件,而不仅仅是基于文本的文件,如JSON,所以我们需要告诉它文件的编码方式。 对于基于文本的文件,编码通常为 utf8: const fs = require('fs'); const jokesFile = fs.readFileSync('./jokes.json', 'utf8');现在如果你把jokesFile记录到控制台,你会看到文件的内容。 但是到目前为止,我们只是在读取文件,而且它还是一个字符串。我们需要使用另一种方法将jokesFile解析为可用的JavaScript对象或数组。 要做到这一点,我们将使用JSON.parse(): const fs = require('fs'); const jokesFile = fs.readFileSync('./jokes.json', 'utf8'); const jokes = JSON.parse(jokesFile); console.log(jokes[0].value); // "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris."顾名思义,JSON.parse()接收一个JSON字符串,并将其解析为一个JavaScript对象字面或数组(object literal or array)。 和上面的require'方法一样,fs.readFileSync()'是一个同步方法,这意味着如果你的程序正在读取一个大文件,不管是JSON还是其他文件,它可能会导致你的程序变慢。 另外,它只读取一次文件并将其加载到内存中。如果文件有变化,你需要在某个时候再次读取该文件。为了使事情更简单,你可能想创建一个简单的函数来读取文件。 以下是可能出现的情况: const fs = require('fs'); const readFile = path => fs.readFileSync(path, 'utf8'); const jokesFile1 = readFile('./jokes.json'); const jokes1 = JSON.parse(jokesFile1); console.log(jokes1[0].value); // "Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris." // the jokes.json file changes at some point const jokesFile2 = readFile('./jokes.json'); const jokes2 = JSON.parse(jokesFile2); console.log(jokes2[0].value); // "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command." 如何用fs.readFile()和JSON.parse()来解析JSON?fs.readFile()方法与fs.readFileSync()非常相似,只是它是异步工作。如果你有一个大文件要读,而你又不想让它耽误你的其他代码,这就很好。 下面是一个基本的例子: const fs = require('fs'); fs.readFile('./jokes.json', 'utf8');到目前为止,这看起来和我们对fs.readFileSync()所做的相似,只是我们没有把它分配给一个像jokesFile这样的变量。因为它是异步的,在fs.readFile()之后的任何代码都会在它完成读取文件之前运行。 相反,我们将使用一个回调函数并解析其中的JSON: const fs = require('fs'); fs.readFile('./jokes.json', 'utf8', (err, data) => { if (err) console.error(err); const jokes = JSON.parse(data); console.log(jokes[0].value); }); console.log("This will run first!");它在控制台中打印出以下内容: This will run first! Chuck Norris's keyboard doesn't have a Ctrl key because nothing controls Chuck Norris.就像fs.readFileSync()一样,fs.readFile()将文件加载到内存中,这意味着如果文件有变化,你需要再次读取文件。 另外,尽管fs.readFile()是异步的,但它最终会将它所读取的整个文件加载到内存中。如果你有一个巨大的文件,最好是研究一下 Node.js streams。 如何在Node.js中用JSON.stringify()对JSON进行字符串化最后,如果你用Node.js解析JSON,很有可能在某些时候需要返回JSON,也许是作为一个API响应。 幸运的是,这与浏览器中的工作方式相同--只需使用JSON.stringify()将JavaScript对象字头或数组转换成JSON字符串: const newJoke = { categories: ['dev'], value: "Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command." }; console.log(JSON.stringify(newJoke)); // {"categories":["dev"],"value":"Chuck Norris's keyboard is made up entirely of Cmd keys because Chuck Norris is always in command."}就这样了! 我们已经涵盖了关于在浏览器和Node.js项目中使用JSON所需要知道的一切。 现在你可以去解析或字符串化JSON,以满足你的需求。 我还有什么遗漏?你是如何在你的项目中解析JSON的?请在 Twitter 上告诉我。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |