2012-08-02 49 views
1

我很難讀下面的JSON(基本上沒有錯誤,沒有任何反應),並希望能夠幫助您找出該函數的問題。我不清楚ajax是否能成功抓取它,或者之後是否正確讀取它。任何幫助將非常感激!Issue Reading JSON

這裏是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 
+1

@Onheiron - 這是「jsonp」,如if(settings.jsonData == true){ dataType =「jsonp」; – McKev 2012-08-02 15:09:30

+0

你的JSON封裝在[]中,這表明它可能被解釋爲一個對象數組。嘗試調用[0] .locname ...並對以前的評論感到抱歉,我沒有很好地閱讀:D – Onheiron 2012-08-02 15:10:45

+0

設置錯誤處理程序。 – epascarello 2012-08-02 15:12:15

回答

1

它看起來像你需要在data變量運行$.parseJSONdata作爲JSON字符串返回,您需要將其轉換爲JavaScript對象字面值。

例子:

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

所以把這個if (settings.jsonData == true)後立即在你success功能:

var data = $.parseJSON(data); 

你沒有得到任何錯誤的原因是因爲$.each(function() {....});不循環,因爲沒有任何東西可以在字符串上循環。

有一個非常簡單的方法來測試data變量的數據類型。在你success函數的開始使用這樣的:如果你得到string

alert(typeof(data)); 

返回,那麼你知道這就是問題所在。

+0

但dataType:'jsonp',不需要... – Onheiron 2012-08-02 15:09:26

+0

dataType可以設置爲JSON,但他仍然收回一串JSON。這串JSON需要被解析(即安全評估)爲對象符號。 – 2012-08-02 15:10:29

+0

正確的解決方案,但我認爲把這個代碼放在'$ .each' - if(setting.jsonData)'內部是最好的地方'因爲如果有XML數據,它不會導致任何問題:) – AdityaParab 2012-08-02 15:16:47

0

$.each之前添加此行

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

和休息您的代碼將只是工作罰款......

爲什麼你的代碼不能正常工作? 原因 - 因爲您正試圖在string上運行您的循環。 首先將string轉換成JSON objecteval()string轉換爲javascript對象。

+1

運行'eval'工程,但不是處理入站JSON字符串最安全的方式,解析方法,如'parseJSON'是首選。 – 2012-08-02 15:15:15

+0

我認爲@Elliot B.方式是正確的,如果這是問題,通常eval()應謹慎使用。 – Onheiron 2012-08-02 15:16:33

+1

哦!感謝信息傢伙,我沒有意識到這一點:)你能告訴我什麼問題,我可能不得不面對'eval()'?因爲我總是使用它...我想開始使用'$ .parseJSON'而不是...我不總是使用jQuery btw,所以我堅持'eval()'..我從來沒有觀察到任何問題與eval()'儘管:) ..只是好奇... – AdityaParab 2012-08-02 15:19:17

0

你的JSON看起來像一個對象數組,你可以通過圍繞它的那些[]來判斷。這是隻有一個元素的數組,但如果你寫

json.key 

這給了錯誤,因爲JSON是不是對象,但對象的數組,所以json.key看起來像你調用一些fncion「關鍵」不在那裏的數組。首先必須選擇真正的對象本身使用JSON [0]像

myJson = json[0] 

的那麼

value = myJson.key1 

如果你使用一些外部API它很可能是這個問題,我面對這之前

+0

如果你看看這個http:// devlog。info/2010/03/10/cross-domain-ajax /在JSONP下使用jQuery部分,它說它應該很容易處理它。我開始相信還有另外一個問題。但我看到數據完美無缺。以下是我工作的網址:http://www.microessentials.com/dealer-locator2 – McKev 2012-08-02 17:15:58

+0

但您是否嘗試了我的建議?這不是一個錯誤或問題,只是服務不知道有多少記錄匹配你的get查詢,所以它把每個記錄放在一個JSON數組中,當我說它是一個數組並不意味着它不正確時JSON,只是你應該期待一個或多個比賽面對你將不得不處理的事實 – Onheiron 2012-08-02 17:26:21

+1

是的,我試過了,它有問題。這似乎是JSONP的回調問題。它一直告訴我它不能調用數據。 – McKev 2012-08-02 18:36:58