1

私は次の JSON を読むのに苦労しており (基本的にエラーはなく、何も起こりません)、関数の問題を特定する助けを得たいと思っていました。ajaxがそれを取得することに成功したのか、それとも後で正しく読み取っていないのかは不明です。どんな助けでも大歓迎です!

JSON 応答の構造は次のとおりです。

   [{"attributes":{"type":"Account","url":"/services/data/v25.0/sobjects/Account/00130000015KJlWAAW"},"id":"00130000015KJlWAAW","locname":"Central Valley Ag","address":"607 North Robinson","city":"Hartington","state":"NE","postal":"68739","phone":"402-254-3354","web":"","lat":"42.627212","lng":"-97.269283"},{"attributes":{"type":"Account","url":"/services/data/v25.0/sobjects/Account/00130000015KJlXAAW"},"id":"00130000015KJlXAAW","locname":"Central Valley Ag","address":"709 Centennial Rd","city":"Wayne","state":"NE","postal":"68787","phone":"402-375-3510","web":"","lat":"42.235756","lng":"-96.998321"}]

これは、JSON を処理するスクリプトの一部です。

   function mapping(orig_lat, orig_lng, origin) {
                $(function () {
                    var dataType;
                    //jsonData is set to true
                    if (settings.jsonData == true) {
                        dataType = "jsonp";
                    } else {
                        dataType = "xml";
                    }
                    $.ajax({
                        type: "GET",
                        url: settings.dataLocation,
                        dataType: dataType,
                        crossDomain: true,                            
                        error: function(jqXHR, textStatus, errorThrown) {   
                    alert('Error Message: '+textStatus);
                    alert('HTTP Error: '+errorThrown);
                },
                        success: function (data) {
                            //After the store locations file has been read successfully
                            var i = 0;

                            if (settings.jsonData == true) {
                                var data = $.parseJSON(data);
                                //Process JSON
                                $.each(data, function () {
                                    var name = this.locname;
                                    var lat = this.lat;
                                    var lng = this.lng;
                                    var address = this.address;
                                    var address2 = this.address2;
                                    var city = this.city;
                                    var state = this.state;
                                    var postal = this.postal;
                                    var phone = this.phone;
                                    var web = this.web;
                                    web = web.replace("http://", "");
                                    var distance = GeoCodeCalc.CalcDistance(orig_lat, orig_lng, lat, lng, GeoCodeCalc.EarthRadiusInMiles);
                                    //Create the array
                                    locationset[i] = new Array(distance, name, lat, lng, address, address2, city, state, postal, phone, web);
                                    i++;
                                });
                            } else {
                                //Process XML
                                $(data).find('marker').each(function () {
                                    //Take the lat lng from the user, geocoded above
                                    var name = $(this).attr('name');
                                    var lat = $(this).attr('lat');
                                    var lng = $(this).attr('lng');
                                    var address = $(this).attr('address');
                                    var address2 = $(this).attr('address2');
                                    var city = $(this).attr('city');
                                    var state = $(this).attr('state');
                                    var postal = $(this).attr('postal');
                                    var phone = $(this).attr('phone');
                                    var web = $(this).attr('web');
                                    web = web.replace("http://", "");
                                    var distance = GeoCodeCalc.CalcDistance(orig_lat, orig_lng, lat, lng, GeoCodeCalc.EarthRadiusInMiles);
                                    //Create the array
                                    locationset[i] = new Array(distance, name, lat, lng, address, address2, city, state, postal, phone, web);
                                    i++;
                                });
                            }

更新: ajax エラー ハンドラーを状態として追加し、ページの読み込み時に次の parseerror を取得しました。

HTTP エラー: エラー: jQuery172036075869924388826_1343923258757 は呼び出されませんでした

次に、関数を実行しようとすると、次のエラーが発生します。

Uncaught TypeError: Property 'alert' of object [object Window] is not a function          dealer-locator-iframe2:273
$.fn.storeLocator.each.$.ajax.error dealer-locator-iframe2:273
f.Callbacks.o jquery.min.js:2
f.Callbacks.p.fireWith jquery.min.js:2
w jquery.min.js:4
f.ajaxTransport.send.d.onload.d.onreadystatechange
4

3 に答える 3

1

変数で実行する必要があるようです$.parseJSON。JSON の文字列として返されるため、JavaScript オブジェクト リテラルに変換する必要があります。datadata

例:

var obj = $.parseJSON('{"name":"John"}');
alert( obj.name === "John" );

したがって、これを関数の直後に配置if (settings.jsonData == true)します。success

var data = $.parseJSON(data);

エラーが発生しない理由は$.each(function() {....});、文字列でループするものが何もないため、ループしていないためです。

data変数のデータ型をテストする非常に簡単な方法があります。success関数の先頭でこれを使用します。

alert(typeof(data));

戻ってきたらstring、それが問題だとわかります。

于 2012-08-02T15:07:09.040 に答える
0

JSON はオブジェクトの配列のように見えますが、それを囲む [] でわかります。要素が1つだけの配列ですが、こう書くとエラーになります

json.key

json はオブジェクトではなくオブジェクトの配列であるため、json.key は、配列内で存在しない関数「キー」を呼び出しているように見えます。最初に json[0] のように実際のオブジェクト自体を選択する必要があります

myJson = json[0]

その後

value = myJson.key1

外部APIを使用している場合、以前に直面したため、この問題である可能性があります

于 2012-08-02T16:54:22.203 に答える
0

$.eachこの行を追加する前に

data = eval("("+data+")");

残りのコードは問題なく動作します...

コードが機能しないのはなぜですか? 理由 - でループを実行しようとしているからstringです。まずそれを に変換しstringますJSON objecteval()オブジェクトに変換stringjavascriptます。

于 2012-08-02T15:14:05.070 に答える