2010-04-29 29 views
1

我试图使用jQuery解析JSON,并遇到问题。使用下面的代码,数据不断回来空:问题在Firefox和Chrome中使用jQuery获取JSON结果(IE8 Works)

<!DOCTYPE html> 
<html> 
    <head> 
    <title>JSON Test</title> 
    </head> 
    <body> 
    <div id="msg"></div> 
    <script src="http://code.jquery.com/jquery-latest.js"></script> 
    <script> 
     $.ajax({ 
      url: 'http://datawarehouse.hrsa.gov/ReleaseTest/HGDWDataWebService/HGDWDataService.aspx?service=HC&zip=20002&radius=10&filter=8357&format=JSON', 
      type: 'GET', 
      dataType: 'json', 
      success: function(data) { 
      $('#msg').html(data[0].title); // Always null in Firefox/Chrome. Works in IE8. 
      }, 
      error: function(data) { 
      alert(data); 
      } 
     }); 
    </script> 
    </body> 
</html> 

的JSON结果如下所示:

{"title":"HEALTHPOINT TYEE CAMPUS","link":"http://www.healthpointchc.org","id":"tag:datawarehouse.hrsa.gov,2010-04-29:/8357","org":"HEALTHPOINT TYEE CAMPUS","address":{"street-address":"4424 S. 188TH St.","locality":"Seatac","region":"Washington","postal-code":"98188-5028"},"tel":"206-444-7746","category":"Service Delivery Site","location":"47.4344818181818 -122.277672727273","update":"2010-04-28T00:00:00-05:00"}

如果我代替我的Flickr的API URL(http://api.flickr.com/services/feeds/photos_public.gne?tags=cat&tagmode=any&format=json&jsoncallback=?),我得到的网址返回我能够使用的有效JSON结果。

我已经成功地验证了我的JSON JSONLint,所以我已经没有意识到我可能做错了什么。

有什么想法?

更新:我让客户端将内容类型切换到application/json。不幸的是,我仍然遇到完全相同的问题。我还更新了我的HTML并包含了我一直在使用的实时URL。

更新2:我刚刚在IE8中给了这个尝试,它工作正常。出于某种原因,它不适用于Firefox 3.6.3或Chrome 4.1.249.1064(45376)。我确实注意到返回的数据存在一个错误(开发人员正在返回一组数据,即使对于总是会返回单个记录的查询),但它仍然困扰着为什么它在其他浏览器中无法正常工作。

注意到我正在从本地文件系统上的HTML文件开始工作可能很重要。我认为这可能是一个XSS问题,但这并不能解释为什么Flickr的作品。

+0

响应代码是什么?你可以尝试切换到'$ .ajax()'调用并检查你的调用中的错误吗? – justkt 2010-04-29 13:56:07

回答

5

Flickr的API支持JSONP,而你连接的那个不支持。

jQuery看到=?并理解有一个JSONP回调请求并创建一个。你可以在你的示例页面使用的jQuery库的第5003行上看到它。

所以,你需要修改两处

  1. 回调参数添加到您的请求。无论你(或你的开发者)想要怎样称​​呼它。假设您选择cb - 因此请将此添加到AJAX请求中:&cb=?(这种方式我们让jQuery为我们处理回调的创建)
  2. 让您的开发人员使服务接受此新参数,并“填充”结果与它返回之前。
+0

非常感谢您的回复。我从来没有想到这一点(我之前从未听说过JSONP)。我正在等另一位开发人员对服务进行更改。在我验证了它的工作后,我会接受这是正确的答案。 – senfo 2010-05-05 14:43:30

3

你有没有考虑过使用更灵活的$ .ajax?我会在那里分解它,看看默认的$ .getJSON是不是提供给你完全你所需要的。

$.ajax({ 
    url: 'results.json', 
    type: 'GET', 
    dataType: 'json', 
    success: function(data, status) 
    { 
     alert(data); 
    } 
}); 

是等价的ajax'parent'实现。试试看看是否有需要设置的特定属性。

+0

我接受了这个建议并更新了上面的代码。 – senfo 2010-04-30 16:48:39

+0

如何为一个错误案例添加一个处理程序来查看是否发生了什么? – justkt 2010-04-30 17:11:17

+0

这实际上是我之前没听说过的东西。我以这种方式实现它:http://api.jquery.com/ajaxError/ 这是你的想法?我更新了我的HTML(上图)以显示我的实现。 – senfo 2010-04-30 17:28:17

1

如果一个url(flickr网址)有效,而另一个没有(你自己的),我会说问题出在你的网址上。

看起来你正在使用相对路径,是你的意图吗?你有没有使用萤火虫的网络面板看看请求是什么样子?

+0

如果我在Firebug的Net面板中查看“响应”选项卡,则仅在使用Flickr URL时才会看到JSON格式的数据。否则,响应流似乎是空的。我**如果我通过telnet连接到端口80并手动执行GET,请参阅预期结果。 – senfo 2010-04-30 17:01:48

3

是否将内容作为“application/json”提供?

+0

非常好的问题。我的猜测是否定的(我的客户写了JSON服务)。我得看看那个。 – senfo 2010-04-29 14:15:17

+0

我几乎肯定这是答案。刚刚检查过它的内容类型:application/atom + xml;字符集= UTF-8。 – senfo 2010-04-29 14:18:54

1

这是一个Crossdomain请求错误的情况。 Flickr的作品,因为它是JSONP,而其他网址不起作用,因为它不是JSONP启用。 1.检查url是否支持JsonP 2.如果没有,请在您的本地域(与网页相同的域)中创建一个代理Web服务 3.调用该代理web服务,然后调用该外部URL服务器端。