为什么JSON.parse无法正常工作?

7

我将dataType设置为“text”,因为我不希望Jquery自动解析我的JSON。

我的代码如下:
var membId = '5';
$('#submitNewDescription').live('click',function(){
    //An ajax request is made to update the DB
    $.ajax({
        url: '../../cgi-bin/qualification.py',
        type: 'POST',
        data: ({newDescription:$('#newDescription').val(),id:membId}),
        dataType: 'text',
        cache: 'false',
        success: function(data){
            json = JSON.parse(data);
            console.log(data);
            console.log(json);
        }
    });
});

它返回这个字符串: {"error":["ORA-01031 insufficient privileges"]} 在两个console.log命令中。这意味着解析不起作用,因为它没有返回JavaScript对象。JSONLint告诉我这是一个有效的JSON。

有人知道发生了什么吗?

谢谢

编辑

我可以设置为'json',这不是问题。问题是JSON.parse和$.parseJSON应该工作。既然他们没有,我把'dataType'改成了'json',但是还是返回相同的字符串。我不知道发生了什么。


为什么你不想让jQuery自动解析JSON? - Matt Ball
2
如果解析不成功,json 将不包含字符串,而是会变成 undefined。一定还有其他问题。确定 json 不是一个对象吗?typeof json 返回什么?另外请注意,json 是一个全局变量(这是不应该的)。 - Felix Kling
你在用什么浏览器?我尝试了ff3.6,它完美地工作了。请尝试[链接]http://jsfiddle.net/scheffield/URDBv/。 - scheffield
有时候简单的事情很有趣。问题是.json不是全局变量,我只是忘记声明它了。而JS告诉我它是未定义的,它认为最好不要解析。@Felix Kling - Frias
4个回答

7
可能是因为你正在寻找$.parseJSON呢?同时我认为jQuery会查看数据并在传递给回调函数之前尽力进行解析。所以,如果它看起来像JSON,那么jQuery已经返回了一个JavaScript对象,然后就无法使用JSON.parse/$.parseJSON再次解析。
你还可以将dataType字段更改为“json”,让jQuery为您完成...

3
一定要让 jQuery 帮你完成它。 - Matt Ball
@MattBall:同意。我的“can”更多是暗示“应该”。但既然他/她决定不这样做(出于任何原因),我只是想提出来。虽然把它推迟到成功函数直到(第一行)转换它并没有意义。 - Brad Christie

2

dataType: 'text'更改为dataType: "json",并将JSON.parse更改为$.parseJSON


1

在所有浏览器中并不存在JSON库。你可能需要自己包含它,比如像http://developer.yahoo.com/yui/json/这样。

或者像其他人建议的那样,使用jQuery的库。你也可以声明json,像var json = ...这样。


0
在我的情况下,我按照以下方式使其工作:
  • 从服务器(一个servlet)中,我指定了json作为响应的数据类型
  • 然后jquery调用已将响应参数解析为JSON对象(因此我不需要运行$.parseJSON)...谢谢https://dev59.com/XVjUa4cB1Zd3GeqPSpWq#6465506

请注意,我可以:直接访问响应对象中的json字段

$.ajax({
        type: "POST",
        url: baseUrl,
        dataType: "json",
        data: theData,
        success: function(response) {

                alert(' status = ' + response.status);
                processResponseJSON(response);
        },

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接