为什么 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 poststring 那么你只需要使用 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 将首字母大写并导致您的代码稍后中断。