除非在不同的字符串变量中复制,否则jQuery.parseJSON无法正常工作

时间:2014-07-04 08:39:45

标签: javascript jquery json

我对javascript和jQuery相当新。我很确定这里有一些简单的东西。 下面的代码将输出:

[{
    "cli_surname":"\u0392\u03bf\u03bd\u03b1\u03c0\u03ac\u03c1\u03c4\u03b7\u03c2",
    "cli_name":"\u039d\u03b1\u03c0\u03bf\u03bb\u03ad\u03c9\u03bd",
    "cli_sex":"M",
    "cli_dob":"1769-08-15",
    "cli_insurance":"1",
    "cli_phone":"9999999999",
    "cli_mobile":"9999999999",
    "cli_email":"bonaparte@hotmail.com",
    "cli_address":"\u0392\u03b1\u03c4\u03b5\u03c1\u03bb\u03ce 18",
    "ct_name":"\u0391\u03b3\u03af\u03b1 \u0392\u03b1\u03c1\u03b2\u03ac\u03c1\u03b1",
    "cli_comments":"\u039c\u03ad\u03b3\u03b1\u03c2"
}]
按照指示

$("#userInfo"),但jQuery.parseJSON将失败。

$.ajax({        
    url: url,
    type: "POST",
    data: "c=" + selected.val(),
    success: function (json) {
        $("#userInfo").html(' ' + json);

        var obj = jQuery.parseJSON( json );
        alert( obj[0].cli_name );
    },
    error: function (xhr) {
        $("#userInfo").html('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText);
    }
}); 

现在,如果我从$("#userInfo")复制上述代码的输出并将其粘贴到一个名为'data'的新变量中并解析它,它就可以工作。

$.ajax({        
    url: url,
    type: "POST",
    data: "c=" + selected.val(),
    success: function (json) {
        $("#userInfo").html(' ' + json);

        data = '[{"cli_surname":"\u0392\u03bf\u03bd\u03b1\u03c0\u03ac\u03c1\u03c4\u03b7\u03c2","cli_name":"\u039d\u03b1\u03c0\u03bf\u03bb\u03ad\u03c9\u03bd","cli_sex":"M","cli_dob":"1769-08-15","cli_insurance":"1","cli_phone":"9999999999","cli_mobile":"9999999999","cli_email":"bonaparte@hotmail.com","cli_address":"\u0392\u03b1\u03c4\u03b5\u03c1\u03bb\u03ce 18","ct_name":"\u0391\u03b3\u03af\u03b1 \u0392\u03b1\u03c1\u03b2\u03ac\u03c1\u03b1","cli_comments":"\u039c\u03ad\u03b3\u03b1\u03c2"}]';
        var obj = jQuery.parseJSON( data );
        $("#userInfo").html(" " + data);
        alert( obj[0].cli_name );
    },
    error: function (xhr) {
        $("#userInfo").html('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText);
    }
});

将typeof应用于两个变量时,结果为string。是什么赋予了?我如何解析data变量而不是json变量,因为它们都是字符串并且似乎包含相同的数据?

3 个答案:

答案 0 :(得分:1)

Ajax调用将在内部为您进行解析。

因此,您的成功函数的参数json已经包含一个有效的javascript对象,这就是解析失败的原因:它是一个对象而不是一个字符串。

然后,构造$("#userInfo").html(' ' + json);会将json再次转换为字符串,这就是为什么在div中看到正确的内容。

变化:

$.ajax({        
    url: url,
    type: "POST",
    dataType: 'json', // this will force the response to be Json 
                      // even if MIME-Type tells something different!
    data: "c=" + selected.val(),
    success: function (json) {
        $("#userInfo").html(' ' + json);

        // unnecessary var obj = jQuery.parseJSON( json );
        alert( json[0].cli_name );
    },
    error: function (xhr) {
        $("#userInfo").html('Request Status: ' + xhr.status + ' Status Text: ' + xhr.statusText + ' ' + xhr.responseText);
    }
}); 

刚添加了dataType,以便在本地覆盖响应的错误MIME类型标头。根据这个Q的第一个答案

答案 1 :(得分:0)

试试这个:
响应将自动解析为json

          $.ajax({
                url: url,
                type: "POST",
                data: "c=" + selected.val(),
                dataType: 'json',     // this param talk that response will be parse automatically
                success: function(data) {
                    console.log(data)
                }
            });

答案 2 :(得分:0)

在解析ur数据变量时未解析json变量的原因是因为json变量具有换行符(\ n)。

由于您的数据变量的字符串在一行中,即没有换行符号,因此该函数会成功解析字符串。

我还应该指出,提供给JSON解析函数的字符串中的tab(\ t)或任何其他转义字符等字符都会导致函数失败。

用于解析的错误字符串var:

var myVar = "This is a text"; //will fail due to new line characters.
var myVar = 'My Friend\'s birthday'; //will fail due to the "\" before "'"
var myVar = '   This is a text.' //will fail due to the tab character at the beginning of the line

“JSON标准不允许”控制字符“,例如制表符或换行符。” - http://api.jquery.com/jquery.parsejson/

查看上面的链接以获取更多信息。