it-swarm-eu.dev

Jquery - Uncaught TypeError: Nie można użyć operatora „in”, aby wyszukać „324”

Próbuję wysłać żądanie Get przez ajax i dane wyjściowe json, które są zwracane przez serwer w html.

Ale dostałem ten błąd.

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

To jest mój kod, który wysyła żądanie Get do pliku php przez ajax ..__ Kiedy używam metody $ .each, otrzymuję błąd, który pokazałem powyżej.

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)
            })
        }
    )

})

To jest mój kod PHP, który zwraca wynik zapytania w formacie json.

public function actionAjax(){

    $parentCatId=$_GET['parentCatId'];

        $catData = Category::getTargetCategoryData($parentCatId);

        echo CJSON::encode($catData);
        Yii::app()->end();

}

dane json wysyłane przez ten php są takie.

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

Ktoś wie, jak rozwiązać ten problem?

Pomóż mi . Z góry dziękuję :)

42
Hayato

Masz łańcuch JSON, a nie obiekt. Powiedz jQuery, że spodziewasz się odpowiedzi JSON i będzie to analizować za Ciebie. Użyj $ .getJSON zamiast $ .get lub przekaż argument dataType na $.get:

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

Możesz również użyć $.parseJSON(data), który jawnie skonwertuje ciąg znaków, który pochodzi ze skryptu PHP na prawdziwą tablicę JSON.

21
HansH

Jeśli pobierasz JSON, użyj $ .getJSON () więc automatycznie konwertuje JSON na obiekt JS.

6
doobdargent

Naprawiłem podobny błąd, dodając json dataType w następujący sposób:

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

A w moim kontrolerze musiałem używać podwójnych cudzysłowów wokół wszystkich takich ciągów (uwaga: muszą one być ukryte w Javie):

@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;
}

Możesz więc użyć podwójnych cudzysłowów wokół liczb, jeśli są one używane jako ciągi znaków (i usuwają ten ostatni przecinek):

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

Użyj getJSON

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

Szczegółowy wygląd tutaj http://api.jquery.com/jQuery.getJSON/

0
TNS MUMET