45

我正在尝试通过 ajax 发送 Get 请求并输出服务器以 html 形式返回的 json 数据。

但是,我得到了这个错误。

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",}]

任何人都知道如何解决这个问题?

请帮帮我。提前致谢 :)

4

6 回答 6

75

你有一个 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'
);
于 2013-08-29T04:08:31.140 回答
22

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

于 2013-11-22T19:55:21.880 回答
6

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

于 2013-08-29T04:08:36.537 回答
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"}]
于 2016-02-26T00:05:44.193 回答
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/

于 2017-09-20T03:20:34.877 回答
0

就我而言,我忘记告诉类型控制器响应是 JSON 对象。response.setContentType("应用程序/json");

于 2020-06-11T10:20:40.587 回答