Jquery - 未捕获的类型错误:不能使用“in”运算符搜索“324”

46
我试图通过ajax发送一个Get请求,并将服务器返回的json数据在html中输出。但是,我收到了这个错误。
Uncaught TypeError: Cannot use 'in' operator to search for '324' in 
[{"id":50,"name":"SEO"},{"id":22,"name":"LPO",}]
这是我的代码,通过ajax向php文件发送Get请求。 当我使用$.each方法时,它会显示上述错误。
parentCat.on('change', function(e){
    parentCatId = $(this).val();

    $.get(
        'index.php?r=admin/post/ajax',
        {"parentCatId":parentCatId},
        function(data){                     
            $.each(data, function(key, value){
                console.log(key + ":" + value)
            })
        }
    )

})

这是我的PHP代码,它以JSON格式返回查询结果。

public function actionAjax(){

    $parentCatId=$_GET['parentCatId'];

        $catData = Category::getTargetCategoryData($parentCatId);
        
        echo CJSON::encode($catData);
        Yii::app()->end();
    
}

这个 PHP 输出的 JSON 数据长成这样。

[{"id":50,"name":"SEO"},{"id":22,"name":"LPO",}]

这个问题应该如何解决?


1
那个错误信息是从哪里来的? - Mike
1
你能在 each 语句之前添加一个 console.log(data) 并查看控制台中打印的内容吗? - Arun P Johny
谢谢!我的问题现在解决了 :) - Hayato
这可能会帮助到某些人 - 我也曾遇到过同样的问题,原因是使用了 $.each('selector')... 而不是 $('selector').each(... - Dylan Valade
6个回答

76

你有一个JSON字符串,而不是一个对象。告诉jQuery你期望一个JSON响应,它会为你解析它。可以使用$.getJSON代替$.get,或者将dataType参数传递给$.get

$.get(
    'index.php?r=admin/post/ajax',
    {"parentCatId":parentCatId},
    function(data){                     
        $.each(data, function(key, value){
            console.log(key + ":" + value)
        })
    },
    'json'
);

对于从谷歌搜索此问题而来的任何人,$.post,将相同的第三个参数添加到$.post也可以解决这个问题。 - Phil Young

22

您也可以使用$.parseJSON(data)来将来自PHP脚本的字符串显式转换成真正的JSON数组。


6
如果你要获取JSON数据,使用$.getJSON()函数,它会自动将JSON转换为JS对象。

5

我通过添加json dataType来修复了类似的错误,代码如下:

$.ajax({
    type: "POST",
    url: "someUrl",
    dataType: "json",
    data: {
        varname1 : "varvalue1",
        varname2 : "varvalue2"
    },
    success: function (data) {
        $.each(data, function (varname, varvalue){
            ...
        });  
    }
});

在我的控制器中,我必须使用双引号来包含任何字符串,例如(注意:它们必须在Java中转义):

@RequestMapping(value = "/someUrl", method=RequestMethod.POST)
@ResponseBody
public String getJsonData(@RequestBody String parameters) {
    // parameters = varname1=varvalue1&varname2=varvalue2
    String exampleData = "{\"somename1\":\"somevalue1\",\"somename2\":\"somevalue2\"}";
    return exampleData;
}

因此,如果您的数字作为字符串使用(并删除最后一个逗号),则可以尝试在数字周围使用双引号:

[{"id":"50","name":"SEO"},{"id":"22","name":"LPO"}]

0
使用 getJSON。
$.getJSON(
'index.php?r=admin/post/ajax',
{"parentCatId":parentCatId},
function(data){                     
    $.each(data, function(key, value){
        console.log(key + ":" + value)
    })
});

详细信息请查看http://api.jquery.com/jQuery.getJSON/


0
在我的情况下,我忘记告诉类型控制器响应是一个 JSON 对象。
response.setContentType("application/json");

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