2

JavaScript配列で返される2つの検索結果にアクセスしようとしています。

ここでそれを行う方法を確認した場合: Access / process (nested) objects, arrays or JSON で、この結果セットに基づいて試しました:

{
    "responseHeader":{
        "status":0,
        "QTime":2,
        "params":{
            "facet":"false",
            "fl":"id,title,friendlyurl,avatar,locpath,objectid,objecttype",
            "indent":"off",
            "q":"title_search:*castle*",
            "wt":"json",
            "defType":"lucene"
        }
    },
    "response":{
        "numFound":2,
        "start":0,
        "docs":[
            {
                "title":"castle a",
                "objecttype":1,
                "friendlyurl":"castle-a",
                "avatar":"6_887_castle-a.JPG",
                "objectid":6
            },
            {
                "title":"castle b",
                "objecttype":1,
                "friendlyurl":"castle-b",
                "avatar":"794_360_13j-castle-by-night.jpg",
                "objectid":794
            }
        ]
    }

}

for (var i = 0, l = data.response.numFound; i < l; i++) {
    console.log(data.response.docs[i].title);
    console.log(data.response.docs[i].objecttype);
    console.log(data.response.docs[i].friendlyurl);
}

サービスを直接呼び出すと結果が返されますが、Chrome コンソール ログにまだ data=null が表示されます。なぜそれが起こっているのですか?

ここに関連するコードがあります

    $("#searchfavs").change(function () {
        $.ajax({
            type: "GET",
            url: "/weddingservice/searchfavoritecompany/?q=" + $("#searchfavs").val(),
            data: "",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (data) {
                data = $.parseJSON(data);
                console.log(data);
                console.log(data.response);
                console.log(data.response.numFound);

                for (var i = 0, l = data.response.numFound; i < l; i++) {
                    console.log(data.response.docs[i].title);
                    console.log(data.response.docs[i].objecttype);
                    console.log(data.response.docs[i].friendlyurl);
                }


            }
        });
        $(this).parent().hide('slow');
    });

結果をループするにはどうすればよいですか?

4

2 に答える 2

3

あなたdataはJSONではありません。あなたが渡したように、そのJSオブジェクトはすでにdataType: 'json'. したがって、次を使用して再度解析する必要はありませんdata = $.parseJSON(data);

jQuery ドキュメントから。

dataType (デフォルト: Intelligent Guess (xml、json、script、または html))
Type : String

サーバーから返されることを期待しているデータのタイプ。何も指定されていない場合、jQuery は応答の MIME タイプに基づいてそれを推測しようとします (XML MIME タイプは XML を生成し、1.4 では JSON は JavaScript オブジェクトを生成し、1.4 ではスクリプトがスクリプトを実行します。文字列として返されます)。利用可能な型 (および成功のコールバックに最初の引数として渡される結果) は次のとおりです。

" json ":レスポンスを JSON として評価し、JavaScript オブジェクトを返します。JSON データは厳密な方法で解析されます。不正な形式の JSON は拒否され、解析エラーがスローされます。jQuery 1.9 以降、空の応答も拒否されます。サーバーは代わりに null または {} の応答を返す必要があります。(適切な JSON 形式の詳細については、json.org を参照してください。)


data含まれていませんitems。が含まれていますresponse。便宜上、見つかったアイテムの数はdata.response.numFound既に表示されています。だから、あなたはこのようにループすることができます

for (var i = 0, l = data.response.numFound; i < l; i++) {
    console.log(data.response.docs[i].title);
    console.log(data.response.docs[i].objecttype);
    console.log(data.response.docs[i].friendlyurl);
}

また、JSON の形式が正しくないことがわかりました。これを機能させるには、JSON が有効である必要があります。@FelixKling が行ったコメントを注意深く理解してください。

于 2013-09-18T14:45:13.183 に答える
0

私は問題を見つけました:

応答データは既にオブジェクトであるため、解析する必要はありません。parseJson を実行しようとすると、null が返されます。

data = $.parseJSON(data); //remove this line which is returning null and try
console.log(data);
console.log(data.response);
console.log(data.response.numFound);
于 2013-09-27T07:11:32.217 に答える