Javascript JSON字符串上的JSON解析抛出“无法将对象转换为基元值”

Javascript JSON字符串上的JSON解析抛出“无法将对象转换为基元值”,javascript,json,node.js,Javascript,Json,Node.js,server.js 使用body解析器中间件、Handlebar和express 路线 客户 当记录req.body时,我得到一个JSON字符串 {{满意:文本1,改进:文本2,评分:0.7}:} 我试着把这个字符串解析成一个对象。当我这样做时,我会收到此错误消息 那么如何将字符串解析为对象呢 通常我会执行JSON.parsereq.body。数据类型并没有说明要发送什么类型的数据,而是说明希望得到什么类型的响应。您需要说您正在通过ajax调用中的contentType:application/

server.js

使用body解析器中间件、Handlebar和express

路线

客户

当记录req.body时,我得到一个JSON字符串

{{满意:文本1,改进:文本2,评分:0.7}:}

我试着把这个字符串解析成一个对象。当我这样做时,我会收到此错误消息

那么如何将字符串解析为对象呢

通常我会执行JSON.parsereq.body。

数据类型并没有说明要发送什么类型的数据,而是说明希望得到什么类型的响应。您需要说您正在通过ajax调用中的contentType:application/JSON发送JSON。详情请参阅。到目前为止,您不是第一个或唯一一个被数据类型命名绊倒的人

这是问题的一半。另一半请参见。

数据类型没有说明要发送什么类型的数据,而是说明您希望得到什么类型的响应。您需要说您正在通过ajax调用中的contentType:application/JSON发送JSON。详情请参阅。到目前为止,您不是第一个或唯一一个被数据类型命名绊倒的人

这是问题的一半。另一半请参见。

因为您使用的是主体解析器中间件,所以不必再次解析req.body,因为主体解析器已经解析了它

范例

如果你用 app.usebodyParser.json

那你就得这么做

module.exports = function (app) {
    app.post('/questionnaire/submit', function (req, res) { // Ajax Call
        var data = req.body; // this is already parsed and is an object
        res.send({});
    });
};
正如@T.J.Crowder所指出的,您还应该发送正确的contentType,以便主体解析器知道其json

function submitData() { // Send a data object to the server
    $.ajax({
        type: 'POST',
        url: '/questionnaire/submit',
        contentType: 'application/json',
        data: JSON.stringify({
            satisfactory: "text 1",
            improvement: "text 2",
            rating: 0.7
        })
    }).done(function () {
        $(location).attr('href', '/sendOff');
    }).fail(function () {

    });
}
因为您使用的是主体解析器中间件,所以不必再次解析req.body,因为主体解析器已经解析了它

范例

如果你用 app.usebodyParser.json

那你就得这么做

module.exports = function (app) {
    app.post('/questionnaire/submit', function (req, res) { // Ajax Call
        var data = req.body; // this is already parsed and is an object
        res.send({});
    });
};
正如@T.J.Crowder所指出的,您还应该发送正确的contentType,以便主体解析器知道其json

function submitData() { // Send a data object to the server
    $.ajax({
        type: 'POST',
        url: '/questionnaire/submit',
        contentType: 'application/json',
        data: JSON.stringify({
            satisfactory: "text 1",
            improvement: "text 2",
            rating: 0.7
        })
    }).done(function () {
        $(location).attr('href', '/sendOff');
    }).fail(function () {

    });
}

您需要设置正确的contentType:

$.ajax({
    type: 'POST',
    url: '/questionnaire/submit',
    contentType: 'application/json',
    data: JSON.stringify({ satisfactory: "text 1", rating: 0.7 })
});


app.post('/questionnaire/submit', function (req, res) { // Ajax Call
    var data = JSON.parse(req.body);
    console.log(data.rating); // 0.7
    res.send(data);
});

此外,使用body parser,您可以避免在服务器端调用JSON.parse。

您需要设置正确的contentType:

$.ajax({
    type: 'POST',
    url: '/questionnaire/submit',
    contentType: 'application/json',
    data: JSON.stringify({ satisfactory: "text 1", rating: 0.7 })
});


app.post('/questionnaire/submit', function (req, res) { // Ajax Call
    var data = JSON.parse(req.body);
    console.log(data.rating); // 0.7
    res.send(data);
});

此外,使用body parser,您可以避免在服务器端调用JSON.parse。

当记录req.body时,我会得到一个JSON字符串,在我看来它不像JSON字符串。它看起来像是带有JSON的东西,但开头的{不是JSON,结尾看起来很奇怪。@t.J.Crowder它是一个{:}格式的字符串,即一个完整的JSON文档作为另一个JSON文档的键,但您不能选择在JSON中使用,因此外部文档无效。@meagar:属性名和其他字符串在JSON中总是双引号。Edit:啊,您编辑过。:-由于OP使用的是JSON.stringify,我们知道它不会有单引号字符串…当记录r时eq.body我得到一个JSON字符串,它在我看来不像JSON字符串。它看起来像是包含JSON的东西,但开头的{不是JSON,结尾看起来很奇怪。@t.J.Crowder它是一个{:}形式的字符串,即一个完整的JSON文档作为另一个JSON文档的键,但您不能选择在JSON中使用,因此外部文档无效。@meagar:属性名和其他字符串在JSON中总是双引号。Edit:啊,您编辑过。:-由于OP使用的是JSON.stringify,我们知道它不会有单引号字符串…很好。Th这是问题的另一半,前一半是。好的观点。这是问题的另一半,前一半是。但我没有提到主体解析器中间件…这非常重要,但我没有提到主体解析器中间件…这非常重要