1

我使用中间人文件从 Flickr API 获取数据(以避免跨域问题):

<?php

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

die(json_encode( file_get_contents($_REQUEST['url']) ) );
?>

此文件由 javascript 获取:

//Flickr
var myurl = encodeURIComponent('http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key=1408bff5f72a4b84b924d13e8562b6a2&photoset_id=77649470@N03&photoset_id=72157629903184261&format=json');
    $.getJSON( "middle.php?url=" + myurl, function(data){
        console.log(typeof data);
    });

但是 console.log 显示结果是一个“字符串”而不是 JSON 对象。我尝试将其转换为 JSON 对象:

jQuery.parseJSON(data)

但控制台给了我这个错误:

Uncaught SyntaxError: Unexpected token j

这是字符串:

jsonFlickrApi({"photoset":{"id":"72157629903184261", "primary":"7115173307", "owner":"77649470@N03", "ownername":"wedocommunication", "photo":[{"id":"7115173331", "secret":"24900ff306", "server":"5447", "farm":6, "title":"Lounge", "isprimary":"0"}, {"id":"7115173307", "secret":"3435f9a983", "server":"7256", "farm":8, "title":"Hofansicht", "isprimary":"1"}, {"id":"7115173379", "secret":"7747e50597", "server":"7278", "farm":8, "title":"Konfi", "isprimary":"0"}, {"id":"6969093048", "secret":"d4389bc0e4", "server":"7055", "farm":8, "title":"Lounge", "isprimary":"0"}, {"id":"6969093086", "secret":"8e7263005b", "server":"5152", "farm":6, "title":"Eingangsbereich", "isprimary":"0"}], "page":1, "per_page":500, "perpage":500, "pages":1, "total":"5"}, "stat":"ok"})

我该怎么做才能将字符串转换为对象?

4

6 回答 6

5

Flickr 将响应作为 jsonp 返回,这是 javascript 而不是 json,您应该为此使用 jquery jsonp 类型请求,请参阅 - http://api.jquery.com/jQuery.ajax/

事实上,该页面提供了 flickr api 的示例-

$.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?",
  {
    tags: "cat",
    tagmode: "any",
    format: "json"
  },
  function(data) {
    $.each(data.items, function(i,item){
      $("<img/>").attr("src", item.media.m).appendTo("#images");
      if ( i == 3 ) return false;
    });
  });
于 2012-04-27T14:35:21.217 回答
2

您不需要使用代理来避免跨域问题,只需使用JSONP request即可。

$.getJSON("http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key=1408bff5f72a4b84b924d13e8562b6a2&photoset_id=77649470@N03&photoset_id=72157629903184261&format=json&jsoncallback=?",function(data){
        console.log(data);
    });​

演示

于 2012-04-27T14:37:10.877 回答
0

JSON 以对象花括号开头不是 JSON 对象的一部分{如果您只需要内部,您可以先替换jsonFlickrApi(字符串以首先删除部分,但似乎 Flickr 会有更好的内置解决方案。 datajsonFlickrApi(

于 2012-04-27T14:35:39.093 回答
0

您必须删除开头的“jsonFlickrApi(”和结尾的“)”,因此“json 字符串”只读{"photoset":{"id":"72157629903184261", "primary":"7115173307", "owner":"77649470@N03", "ownername":"wedocommunication", "photo":[{"id":"7115173331", "secret":"24900ff306", "server":"5447", "farm":6, "title":"Lounge", "isprimary":"0"}, {"id":"7115173307", "secret":"3435f9a983", "server":"7256", "farm":8, "title":"Hofansicht", "isprimary":"1"}, {"id":"7115173379", "secret":"7747e50597", "server":"7278", "farm":8, "title":"Konfi", "isprimary":"0"}, {"id":"6969093048", "secret":"d4389bc0e4", "server":"7055", "farm":8, "title":"Lounge", "isprimary":"0"}, {"id":"6969093086", "secret":"8e7263005b", "server":"5152", "farm":6, "title":"Eingangsbereich", "isprimary":"0"}], "page":1, "per_page":500, "perpage":500, "pages":1, "total":"5"}, "stat":"ok"}

然后可以由 JS 将其解析为常规 JSON 数据。

于 2012-04-27T14:36:00.173 回答
0

有人发布了我正在寻找的答案,但由于某种原因他们删除了该帖子,所以我在这里复制它:

$.ajax({
    url: 'http://api.flickr.com/services/rest/?method=flickr.photosets.getPhotos&api_key=1408bff5f72a4b84b924d13e8562b6a2&photoset_id=77649470@N03&photoset_id=72157629903184261&format=json',
    type: 'GET',
    dataType: 'jsonp',
    jsonpCallback: 'jsonFlickrApi',
    success: function(data){
        console.log(data);
    }
});

这完美地完成了这项工作。谢谢,不管是谁:)

可能还有其他工作,但这是我感觉更舒服的工作。谢谢你们。

于 2012-04-27T14:50:26.150 回答
0

正如上面已经提到的,Flickr 将包裹在jsonFlickrApi回调方法中的 JSON 响应发送出去。

要仅返回纯 JSON 数据,您可以使用nojsoncallback=1request 参数。

例如http://api.flickr.com/services/rest/?method=flickr.photos.getSizes&api_key=_secret_app_key&photo_id=8321754843&format=json&nojsoncallback=1

于 2013-02-03T09:01:43.540 回答