为什么 typeof JSON.parse returns 字符串
Why does typeof JSON.parse returns string
简要说明
我正在使用 bottle.py 作为一个简单的网络服务器,我正在呈现一个 javascript,将它传递给一个 python 字典,然后在 javascript 文件中我想向对象添加另一个字段并使用结果发出 post 请求。
然而,当我在 likePost()
returns 字符串中记录 typeof 数据时,我无法将新的 属性 添加到对象中。
另外,我在没有 JSON.Stringify()
和 returns 的情况下尝试了以下错误:Unexpected token ' in JSON at position
代码
function commentPost(post){
var comment = prompt("Comment:", "Great post I like it")
data = JSON.parse(JSON.stringify(post))
console.log(typeof data) // RETURNS STRING
data.comment = comment // THIS DOESN'T WORK
fetch("/post", {
method: "POST",
body: JSON.stringify(data)
}).then(res => {
likePost(data)
});
}
Console.log(post)
{'hashtag': 'landscapephotography', 'shortcode': 'B_5b0IWqrRU', 'display_url': 'https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/e35/s1080x1080/95910887_233194497953707_7239044831960646903_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=107&_nc_ohc=i179pDQmui0AX82O3nB&oh=676ca07cba3af57944abcba4d3a27ad2&oe=5EDE8D74', 'thumbnail_src': 'https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/sh0.08/e35/s640x640/95910887_233194497953707_7239044831960646903_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=107&_nc_ohc=i179pDQmui0AX82O3nB&oh=1ff2ac0b031bcc7cbdbb64b2a661ea1b&oe=5EDF0745', 'is_video': False, 'comments_disabled': False, 'caption': 'Photo by Jelen Girona on May 07, 2020.', 'comments_count': 0, 'timestamp': 1588877630, 'owner': '15642627659', 'likes_count': 0}
Console.log(typeof post)
string
虽然你的 typeof post
是 string
那么你只需要使用 JSON.parse
.
失败的原因是,对于完整的 JSON 语法,有效的 JSON 只能有 double quotes(also check here。尝试:
JSON.parse(post.replace(/\'/g, '"'))
但是对于你的情况(我刚刚看到你更新的问题),你的来源似乎 return False
第一个字母大写,在尝试上述操作后你会得到一个新的错误。
Uncaught SyntaxError: Unexpected token F in JSON at position 617
如果你不能APIreturn,你也必须.replace
。
const post = "{'hashtag': 'landscapephotography', 'shortcode': 'B_5b0IWqrRU', 'display_url': 'https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/e35/s1080x1080/95910887_233194497953707_7239044831960646903_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=107&_nc_ohc=i179pDQmui0AX82O3nB&oh=676ca07cba3af57944abcba4d3a27ad2&oe=5EDE8D74', 'thumbnail_src': 'https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/sh0.08/e35/s640x640/95910887_233194497953707_7239044831960646903_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=107&_nc_ohc=i179pDQmui0AX82O3nB&oh=1ff2ac0b031bcc7cbdbb64b2a661ea1b&oe=5EDF0745', 'is_video': False, 'comments_disabled': False, 'caption': 'Photo by Jelen Girona on May 07, 2020.', 'comments_count': 0, 'timestamp': 1588877630, 'owner': '15642627659', 'likes_count': 0}"
const postObject = JSON.parse(post.replace(/\'/g, '"').replace(/False/g, 'false'));
console.log(postObject);
我建议您也检查一下 true
。也许您的 source/API/backend 也 return 将首字母大写并导致您的代码稍后中断。
简要说明
我正在使用 bottle.py 作为一个简单的网络服务器,我正在呈现一个 javascript,将它传递给一个 python 字典,然后在 javascript 文件中我想向对象添加另一个字段并使用结果发出 post 请求。
然而,当我在 likePost()
returns 字符串中记录 typeof 数据时,我无法将新的 属性 添加到对象中。
另外,我在没有 JSON.Stringify()
和 returns 的情况下尝试了以下错误:Unexpected token ' in JSON at position
代码
function commentPost(post){
var comment = prompt("Comment:", "Great post I like it")
data = JSON.parse(JSON.stringify(post))
console.log(typeof data) // RETURNS STRING
data.comment = comment // THIS DOESN'T WORK
fetch("/post", {
method: "POST",
body: JSON.stringify(data)
}).then(res => {
likePost(data)
});
}
Console.log(post)
{'hashtag': 'landscapephotography', 'shortcode': 'B_5b0IWqrRU', 'display_url': 'https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/e35/s1080x1080/95910887_233194497953707_7239044831960646903_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=107&_nc_ohc=i179pDQmui0AX82O3nB&oh=676ca07cba3af57944abcba4d3a27ad2&oe=5EDE8D74', 'thumbnail_src': 'https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/sh0.08/e35/s640x640/95910887_233194497953707_7239044831960646903_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=107&_nc_ohc=i179pDQmui0AX82O3nB&oh=1ff2ac0b031bcc7cbdbb64b2a661ea1b&oe=5EDF0745', 'is_video': False, 'comments_disabled': False, 'caption': 'Photo by Jelen Girona on May 07, 2020.', 'comments_count': 0, 'timestamp': 1588877630, 'owner': '15642627659', 'likes_count': 0}
Console.log(typeof post)
string
虽然你的 typeof post
是 string
那么你只需要使用 JSON.parse
.
失败的原因是,对于完整的 JSON 语法,有效的 JSON 只能有 double quotes(also check here。尝试:
JSON.parse(post.replace(/\'/g, '"'))
但是对于你的情况(我刚刚看到你更新的问题),你的来源似乎 return False
第一个字母大写,在尝试上述操作后你会得到一个新的错误。
Uncaught SyntaxError: Unexpected token F in JSON at position 617
如果你不能APIreturn,你也必须.replace
。
const post = "{'hashtag': 'landscapephotography', 'shortcode': 'B_5b0IWqrRU', 'display_url': 'https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/e35/s1080x1080/95910887_233194497953707_7239044831960646903_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=107&_nc_ohc=i179pDQmui0AX82O3nB&oh=676ca07cba3af57944abcba4d3a27ad2&oe=5EDE8D74', 'thumbnail_src': 'https://scontent-mad1-1.cdninstagram.com/v/t51.2885-15/sh0.08/e35/s640x640/95910887_233194497953707_7239044831960646903_n.jpg?_nc_ht=scontent-mad1-1.cdninstagram.com&_nc_cat=107&_nc_ohc=i179pDQmui0AX82O3nB&oh=1ff2ac0b031bcc7cbdbb64b2a661ea1b&oe=5EDF0745', 'is_video': False, 'comments_disabled': False, 'caption': 'Photo by Jelen Girona on May 07, 2020.', 'comments_count': 0, 'timestamp': 1588877630, 'owner': '15642627659', 'likes_count': 0}"
const postObject = JSON.parse(post.replace(/\'/g, '"').replace(/False/g, 'false'));
console.log(postObject);
我建议您也检查一下 true
。也许您的 source/API/backend 也 return 将首字母大写并导致您的代码稍后中断。