Javascript 问题阅读JSON
我在阅读下面的JSON时遇到了困难(基本上没有错误,也没有发生任何事情),我希望能得到帮助来确定函数的问题。我不清楚ajax是否成功地抓住了它,或者它只是事后没有正确地阅读它。任何帮助都将不胜感激 以下是JSON响应的结构:Javascript 问题阅读JSON,javascript,jquery,ajax,json,jsonp,Javascript,Jquery,Ajax,Json,Jsonp,我在阅读下面的JSON时遇到了困难(基本上没有错误,也没有发生任何事情),我希望能得到帮助来确定函数的问题。我不清楚ajax是否成功地抓住了它,或者它只是事后没有正确地阅读它。任何帮助都将不胜感激 以下是JSON响应的结构: [{"attributes":{"type":"Account","url":"/services/data/v25.0/sobjects/Account/00130000015KJlWAAW"},"id":"00130000015KJlWAAW","locname"
[{"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
看起来您需要在
数据
变量上运行$.parseJSON
<代码>数据以JSON字符串的形式返回,您需要将其转换为JavaScript对象文本
例如:
var obj = $.parseJSON('{"name":"John"}');
alert( obj.name === "John" );
因此,在success
函数的if(settings.jsonData==true)
之后立即放置此项:
var data = $.parseJSON(data);
alert(typeof(data));
没有收到任何错误的原因是$.each(function(){….})
没有循环,因为字符串上没有任何东西可以循环
有一种非常简单的方法可以测试data
变量的数据类型。在success
功能开始时使用此选项:
var data = $.parseJSON(data);
alert(typeof(data));
如果返回了
字符串
,那么您就知道问题出在哪里了。看起来您需要在数据
变量上运行$.parseJSON
<代码>数据以JSON字符串的形式返回,您需要将其转换为JavaScript对象文本
例如:
var obj = $.parseJSON('{"name":"John"}');
alert( obj.name === "John" );
因此,在success
函数的if(settings.jsonData==true)
之后立即放置此项:
var data = $.parseJSON(data);
alert(typeof(data));
没有收到任何错误的原因是$.each(function(){….})
没有循环,因为字符串上没有任何东西可以循环
有一种非常简单的方法可以测试data
变量的数据类型。在success
功能开始时使用此选项:
var data = $.parseJSON(data);
alert(typeof(data));
如果返回了
字符串
,则您知道这就是问题所在。在$之前。每个都添加此行
data = eval("("+data+")");
剩下的代码可以正常工作
为什么你的代码不起作用?
原因-因为您试图在字符串上运行循环。
首先将该字符串
转换为JSON对象
eval()
将string
转换为javascript
对象。在$之前。每个添加此行
data = eval("("+data+")");
剩下的代码可以正常工作
为什么你的代码不起作用?
原因-因为您试图在字符串上运行循环。
首先将该字符串
转换为JSON对象
eval()
将string
转换为javascript
对象。您的JSON看起来像是一个对象数组,您可以通过它周围的[]来判断。它是一个只有一个元素的数组,但如果您编写
json.key
因为json不是一个对象而是一个对象数组,所以json.key看起来像是在调用数组中不存在的某个fncion“key”。您应该首先使用类似于json[0]的方法选择真实对象本身
myJson = json[0]
那么
value = myJson.key1
如果您使用的是某种外部API,可能就是这个问题,因为我以前遇到过这个问题您的JSON看起来像一个对象数组,您可以从它周围的[]来判断。它是一个只有一个元素的数组,但如果您编写
json.key
因为json不是一个对象而是一个对象数组,所以json.key看起来像是在调用数组中不存在的某个fncion“key”。您应该首先使用类似于json[0]的方法选择真实对象本身
myJson = json[0]
那么
value = myJson.key1
如果您使用的是某种外部API,则很可能是这个问题,因为我以前遇到过这个问题@Onheiron-它是“jsonp”,就像(settings.jsonData==true){dataType=“jsonp”;您的JSON包含在[]中,这表明它可能被解释为一个对象数组。请尝试调用此[0].locname…很抱歉之前的评论,我读得不太好:D@Onheiron-它是“jsonp”,就像(settings.jsonData==true){dataType=“jsonp”;您的JSON包含有[],这表明它可能被解释为一个对象数组。请尝试调用此[0].locname…很抱歉前面的评论,我读得不太好:数据类型可以设置为JSON,但他仍然得到一个JSON字符串。该JSON字符串需要解析(即,安全评估)为对象表示法。正确的解决方案,但我认为最好将此代码放在$之前。每个-内部如果(setting.jsonData)
因为如果有XML数据,它不会导致任何问题:)哦,你是对的,我错过了JSON vs XML的if/then语句,答案已更新。@ElliotB。我在发出警报(typeof(data))时没有得到任何返回;因此,我认为可能需要将ajax错误处理程序设置为epascarello状态;并且再次没有发生任何错误。@Onheiron我更新了我的帖子,以包含我看到的错误-您以前看到过吗?数据类型可以设置为JSON,但他仍然返回一个JSON字符串。需要解析该JSON字符串(即,安全评估)正确的解决方案,但我认为最好将此代码放在$之前。每个-在if(setting.jsonData)中
因为如果有XML数据,它不会导致任何问题:)哦,你是对的,我错过了JSON vs XML的if/then语句,答案已更新。@ElliotB。当我发出警报(typeof(data))时,我没有得到任何返回;所以我想我可能需要将ajax错误处理程序设置为epascarello状态。另外,我添加了var data=$.parseJSON(data);并且再次没有发生任何错误。@Onheiron I