关于json的小疑问?

我的理解是json就是一种特殊格式的字符串,本质上是字符串。

然后我看菜鸟驿站的关于JSON.parse()的定义是:将一个JSON 字符串转换为对象。

const express = require('express')
const app = express()
const port = 4000
app.engine('html',require('express-art-template'))
app.get('/', (req, res) => {res.render('1.html')})
app.get('/hello', (req, res) => {
    var b = {a:"bbb"}
    res.send(b)
    res.end()
})
app.listen(port, () => console.log(`Example app listening on port port!`))
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
    <title>Document</title>
</head>
<body>  
    <script>
$.ajax({
    url: "/hello",
    type: "GET",
    success: function(data){  
                         console.log(JSON.parse(data));
                  }})
    </script>
   
</body>
</html>

上面两块代码是我写的测试程序,第二块代码就是1.html,当在浏览器中输入http://localhost:4000/时会渲染1.html文件,同时1.html会请求/hello的数据也就是变量b。

但是变量b是一个js对象而不是JSON字符串,应该不能用JSON.parse()方法啊?但是我浏览器的控制台中打印出来的却是一个对象,而且没有报错,这是为什么呢?

阅读 1.9k
3 个回答

b 在接口里是个对象,当你 send 的时候,他是以一个 json 字符串返回给前端的.前端拿到这个 json 字符串后,你 JSON.parse 转成了一个对象,然后你输出了一个对象,没错啊.

你不会想着,你上面的 json 返回的直接是一个 js 对象吧.对象传输的时候是要序列化的,你这个地方就是序列化成了 json 字符串.

res.send(b) 是将后端js对象转为json字符串响应给前端
JSON.parse签名如下

JSON.parse(text[, reviver])

天哪我太慢了。如果你还想深入的话可以看看 express 源码,express/response.js 的第 158 行显示,当 res.send 的参数是一个对象时,实际调用的是 res.jsonres.json 函数内部第 260 行通过调用 stringify,一个在第 1118 行定义的主要部分是 JSON.stringify 的函数,将你的 Object 转成字符串,再重新由第 267 行传回 res.send 发送。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题