yii Jquery -未捕获的类型错误:无法使用“in”运算符在中搜索“324”

zujrkrfu  于 2022-11-09  发布在  jQuery
关注(0)|答案(6)|浏览(143)

我尝试通过 AJAX 发送一个Get请求,并以html格式输出服务器返回的json数据。
但是,我得到了这个错误。

Uncaught TypeError: Cannot use 'in' operator to search for '324' in 
[{"id":50,"name":"SEO"},{"id":22,"name":"LPO",}]

这是我的代码,发送一个Get请求到php文件的 AJAX .当我使用$.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",}]

有人知道如何解决这个问题吗?
请帮助我。提前感谢:)

kupeojn6

kupeojn61#

你有一个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'
);
tp5buhyn

tp5buhyn2#

您还可以使用$.parseJSON(data),它将显式地将来自PHP脚本的字符串转换为真实的的JSON数组。

ix0qys7i

ix0qys7i3#

如果要获取JSON,请使用$.getJSON(),这样它会自动将JSON转换为JS对象。

pobjuy32

pobjuy324#

我通过添加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"}]
fkaflof6

fkaflof65#

使用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/

wvt8vs2t

wvt8vs2t6#

在我的例子中,我忘了告诉类型控制器响应是JSON对象。

response.setContentType("application/json");

相关问题