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 として返しています。これは json ではなく JavaScript です。これには 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

jsonFlickrApiすでに上で述べたように、Flickrはコールバックメソッドにラップされた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 に答える
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

JSON はオブジェクト中括弧で始まります。{これjsonFlickrApi(は JSON オブジェクトの一部ではありません。内部のみが必要な場合は、最初に文字列を置換 dataして最初にパーツを削除できますが、Flickr の方が優れた組み込みソリューションがあるようです。jsonFlickrApi(

于 2012-04-27T14:35:39.093 に答える
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 に答える