首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环遍历来自Flickr的API结果

循环遍历来自Flickr的API结果
EN

Stack Overflow用户
提问于 2013-12-19 19:05:54
回答 2查看 283关注 0票数 4

我真的很费劲才能把这事办好。

我正在查询Flickr,它返回了一组数组和散列,我可以通过循环将数据添加到我的应用程序中。

我已经开始编写一些代码来迭代API结果来创建集合。但是,它一直在失败,并且怀疑你们中是否有人能看到我是以正确的方式做这件事,还是找出我做错了什么:

代码语言:javascript
复制
  def self.add_collection(collection)
    puts "Adding collection..."
    Collection.create!({
        :flickr_id    =>  collection['id'],
        :title        =>  collection['title'],
        :description  =>  collection['description']
      })
    puts "Added collection."
  end


  def self.add_all
    tree = Flickr.collections_list
    pp tree
    puts "Got response from Flickr"
    tree.each do |c|
      c[1].each do |c|
        add_collection(c)
        if c["collection"]
          add_collection(c['collection'][0])
        end
      end
    end
  end

我的API结果是:

代码语言:javascript
复制
{"collections"=>
  {"collection"=>
    [{"id"=>"57928212-7215447632914033423",
      "title"=>"site.co.uk",
      "description"=>"",
      "iconlarge"=>"/images/collection_default_l.gif",
      "iconsmall"=>"/images/collection_default_s.gif",
      "collection"=>
       [{"id"=>"57928212-721457634949706778",
         "title"=>"Holidays",
         "description"=>"",
         "iconlarge"=>"/images/collection_default_l.gif",
         "iconsmall"=>"/images/collection_default_s.gif",
         "collection"=>
          [{"id"=>"57928212-724157634943457291",
            "title"=>"Standard",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576289846181735",
               "title"=>"Di-ip",
               "description"=>"11th-13th May 2008 - (-W)"},
              {"id"=>"7215-90497324306",
               "title"=>"O-ay",
               "description"=>
                "August 2005 - (P- T)"},
              {"id"=>"721576290947297760",
               "title"=>"Iceland Holiday",
               "description"=>
                "5- 2004 - (N-)"}]},
           {"id"=>"57928212-742157629691182748",
            "title"=>"1 - W-09",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576296835355462",
               "title"=>"D-er",
               "description"=>""},
              {"id"=>"721576294683541696",
               "title"=>"D-rea",
               "description"=>""},
              {"id"=>"721576296843554852",
               "title"=>"D-gdom",
               "description"=>""},
              {"id"=>"721576297104465912",
               "title"=>"Day 4 - Gilr-walk",
               "description"=>""},
              {"id"=>"721576294710474644",
               "title"=>
                "Day 5 - Calif-uth",
               "description"=>""},
              {"id"=>"721576249710489442",
               "title"=>"Day 6 - Si-untain",
               "description"=>""},
              {"id"=>"721576429834618028",
               "title"=>
                "Day 7 - Unive-za",
               "description"=>""},
              {"id"=>"721576249834637138",
               "title"=>"Day 8 - Se-Park",
               "description"=>""},
              {"id"=>"721576249836419418",
               "title"=>"Day 9 - Lego-Park",
               "description"=>""},
              {"id"=>"721576249851123596",
               "title"=>"Day 10 - Kn-re City",
               "description"=>""},
              {"id"=>"721576298541700916",
               "title"=>"Day 11 & 12 - Disn-sort",
               "description"=>""},
              {"id"=>"721576249851713058",
               "title"=>"Day 13,14 & 15 - La-as",
               "description"=>""}]},
           {"id"=>"57928212-721547629866347760",
            "title"=>"2 - Mi-10",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576294866337538",
               "title"=>"Day 0 - Arr-rica",
               "description"=>""},
              {"id"=>"721576298468655454",
               "title"=>"Day 1 - M-a",
               "description"=>""},
              {"id"=>"721576299707347598",
               "title"=>"Day 2 - Adven-n",
               "description"=>""},
              {"id"=>"721576430011649024",
               "title"=>"Day 3 - W-un",
               "description"=>""},
              {"id"=>"721576304034790528",
               "title"=>"Day 4 - Sil-",
               "description"=>""},
              {"id"=>"721576300354520246",
               "title"=>"Day 5 - St-eum",
               "description"=>""},
              {"id"=>"721576300443090072",
               "title"=>"Day 6 - Si-uis",
               "description"=>""},
              {"id"=>"721576300443098290",
               "title"=>"Day 7 - Ho-rld",
               "description"=>""},
              {"id"=>"721576300448416804",
               "title"=>"Day 8 - Indi-ach",
               "description"=>""},
              {"id"=>"721576300448431390",
               "title"=>"Day 9 - -ca",
               "description"=>""},
              {"id"=>"721457629997482351",
               "title"=>
                "Day 10 - Mount O-eads",
               "description"=>""},
              {"id"=>"721576304059600702",
               "title"=>"Day 11 - Vall-",
               "description"=>""}]},
           {"id"=>"57928212-721457630658165668",
            "title"=>"3 - Intim-010",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576341693409808",
               "title"=>
                "Day 1 - Gre-n City",
               "description"=>""},
              {"id"=>"721576306547898798",
               "title"=>"Day 1 - C-s",
               "description"=>""},
              {"id"=>"721576306924436584",
               "title"=>"Day 2 - -d",
               "description"=>""},
              {"id"=>"721547630699845912",
               "title"=>"Day 3 - Ran-vities",
               "description"=>""},
              {"id"=>"721576304714758818",
               "title"=>"Day 4 - Lo-urg",
               "description"=>""},
              {"id"=>"721576304717785454",
               "title"=>"Day 5 - Bu-urg",
               "description"=>""},
              {"id"=>"721576304717785576",
               "title"=>"Day 6 - Kin-ion",
               "description"=>""}]},
           {"id"=>"57928212-742157631693570817",
            "title"=>"4 - Bes-12",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576316493011733",
               "title"=>
                "Day 0 - Early -orld Park",
               "description"=>""},
              {"id"=>"721576316934409808",
               "title"=>
                "Day 1 - Grea-ity",
               "description"=>""},
              {"id"=>"721576431698474564",
               "title"=>"Day 2 - Shijin-rk",
               "description"=>""},
              {"id"=>"721576341703216195",
               "title"=>
                "Day 3 - Happ-rk",
               "description"=>""},
              {"id"=>"721574631713251068",
               "title"=>"Day 4 - Victo-g",
               "description"=>""},
              {"id"=>"721576314761492087",
               "title"=>"Day 5 - Floral-ark",
               "description"=>""},
              {"id"=>"721576318148565932",
               "title"=>"Day 6 - H-du",
               "description"=>""},
              {"id"=>"721576318148581382",
               "title"=>"Day -ry",
               "description"=>""},
              {"id"=>"721576318419272104",
               "title"=>
                "Day 8 - Ha-Park",
               "description"=>""},
              {"id"=>"721576314820243661",
               "title"=>
                "Day 9 - Sha-ruise",
               "description"=>""},
              {"id"=>"721574631872193783",
               "title"=>
                "Day 10 - Fisherma-ervatory",
               "description"=>""},
              {"id"=>"721574631874073880",
               "title"=>
                "Day 11- Gongqin-ark",
               "description"=>""},
              {"id"=>"721576318474794697",
               "title"=>"Day 12 - Hap-ark",
               "description"=>""},
              {"id"=>"721576318940558319",
               "title"=>"Day 13 - -",
               "description"=>""},
              {"id"=>"721576319544111677",
               "title"=>
                "Day 14 - G-World",
               "description"=>""},
              {"id"=>"721576319624210803",
               "title"=>
                "Day 15 - Chi-or",
               "description"=>""},
              {"id"=>"721576319628749339",
               "title"=>
                "Day 16 - Kn-rld",
               "description"=>""},
              {"id"=>"721576319751048564",
               "title"=>"Day 17 - Ha-hen",
               "description"=>""},
              {"id"=>"721576319749243775",
               "title"=>"Day 18 - O-eing",
               "description"=>""},
              {"id"=>"721576319765947399",
               "title"=>"Day 19 - Dis-ong",
               "description"=>""}]},
           {"id"=>"57928212-721576434943433385",
            "title"=>"5 - T-13",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576349908483894",
               "title"=>"Day 1 - Tai-ng",
               "description"=>""},
              {"id"=>"721576349954099233",
               "title"=>"Day 2 - -",
               "description"=>""},
              {"id"=>"721576350042484738",
               "title"=>"Day 3 - J-orld",
               "description"=>""},
              {"id"=>"721576350594662914",
               "title"=>
                "Day 4 - For-t",
               "description"=>""},
              {"id"=>"721576350545445863",
               "title"=>"Day 5-dise",
               "description"=>""},
              {"id"=>"721576352944144798",
               "title"=>
                "Day 6 - L-na",
               "description"=>""}]},
           {"id"=>"57928212-721576435094962919",
            "title"=>"6 - Japan 2013",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576350944001201",
               "title"=>"Day 1 - Fli-dium",
               "description"=>""},
              {"id"=>"721576350494923653",
               "title"=>"Day 2 - Tok-a",
               "description"=>""},
              {"id"=>"721576350497502859",
               "title"=>"Day 3 - Tobu Zoo",
               "description"=>""},
              {"id"=>"721576351430344700",
               "title"=>"Day 4 - Uni-an",
               "description"=>""},
              {"id"=>"721457635131070810",
               "title"=>"Day 5 - Hira-mple",
               "description"=>""},
              {"id"=>"721576351444725534",
               "title"=>"Day 6 - Yo-adise",
               "description"=>""},
              {"id"=>"721576351454178145",
               "title"=>"Day 7 - Nag-nd",
               "description"=>""},
              {"id"=>"721547635164257344",
               "title"=>"Day 8 - Hok-oro",
               "description"=>""},
              {"id"=>"721576354182539619",
               "title"=>"Day 9 - Ru-ort",
               "description"=>""},
              {"id"=>"721576351472948421",
               "title"=>"Day 10 - Jo-ea",
               "description"=>""},
              {"id"=>"721576351894974362",
               "title"=>"Day 11 - -d",
               "description"=>""},
              {"id"=>"721576352035465038",
               "title"=>"Day 12- Tok-kitori",
               "description"=>""},
              {"id"=>"721576352574508275",
               "title"=>"Day 13- To-a",
               "description"=>""},
              {"id"=>"721576352746739360",
               "title"=>"Day 14 - Tok-ea",
               "description"=>""},
              {"id"=>"721576354268544001",
               "title"=>"Day 15 - --ea",
               "description"=>""}]}]},
        {"id"=>"57928212-721574628668300643",
         "title"=>"Days out",
         "description"=>"",
         "iconlarge"=>"/images/collection_default_l.gif",
         "iconsmall"=>"/images/collection_default_s.gif",
         "collection"=>
          [{"id"=>"57928212-721457628668352769",
            "title"=>"One off's",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576308409580828",
               "title"=>"ChThisip",
               "description"=>"Sun 29th July 2012 (Neil T, Mandy T)"},
              {"id"=>"721576306394290306",
               "title"=>"Blackpool - 8th Jul 2012",
               "description"=>
                "(Neil T, MThisS, Ben K)"},
              {"id"=>"721576299940667113",
               "title"=>
                "Legoland Thisne 2010",
               "description"=>"This)"},
              {"id"=>"721576294405676947",
               "title"=>"SkThisl 1)",
               "description"=>""},
              {"id"=>"721576294391564267",
               "title"=>"Canal Boating",
               "description"=>
                "SunThismas)"},
              {"id"=>"721576294391564197",
               "title"=>"SThisert",
               "description"=>
                "12th Jul 2003 - (PeThisrk T)"},
              {"id"=>"721576294391560887",
               "title"=>"BThises",
               "description"=>
                " 29thThiss A)"},
              {"id"=>"721576290848461747",
               "title"=>"Go Karting 2012",
               "description"=>" 28th Jan 2012 for Neil's birthday"},
              {"id"=>"721576349284451987",
               "title"=>
                "SThis A)",
               "description"=>""}]},
           {"id"=>"57928212-721574628668280287",
            "title"=>"Theme Parks",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "collection"=>
             [{"id"=>"57928212-721457634949768308",
               "title"=>"TThisrk",
               "description"=>"",
               "iconlarge"=>"/images/collection_default_l.gif",
               "iconsmall"=>"/images/collection_default_s.gif",
               "set"=>
                [{"id"=>"721576334256718298",
                  "title"=>
                   "TThisP)",
                  "description"=>""}]},
              {"id"=>"57928212-721576429626109372",
               "title"=>"PlThisl",
               "description"=>"",
               "iconlarge"=>"/images/collection_default_l.gif",
               "iconsmall"=>"/images/collection_default_s.gif",
               "set"=>
                [{"id"=>"7215762945459430821",
                  "title"=>"PThis11",
                  "description"=>"(Neil T, Rick M, Jackie DM)"}]},
              {"id"=>"57928212-721576249991000745",
               "title"=>"GuThisld",
               "description"=>"",
               "iconlarge"=>"/images/collection_default_l.gif",
               "iconsmall"=>"/images/collection_default_s.gif",
               "set"=>
                [{"id"=>"721576296244407020",
                  "title"=>"GThis011",
                  "description"=>
                   "(NeiThiseorge)"}]},
              {"id"=>"57928212-721576294990999301",
               "title"=>"FThisd",
               "description"=>"",
               "iconlarge"=>"/images/collection_default_l.gif",
               "iconsmall"=>"/images/collection_default_s.gif",
               "set"=>
                [{"id"=>"721576294625410346",
                  "title"=>"FlThis0",
                  "description"=>"(NThis)"}]},
              {"id"=>"57928212-721457628668340547",
               "title"=>"DrThisor",
               "description"=>"",
               "iconlarge"=>"/images/collection_default_l.gif",
               "iconsmall"=>"/images/collection_default_s.gif",
               "set"=>
                [{"id"=>"721576294638932742",
                  "title"=>"DraThis010",
                  "description"=>"(NThisW)"}]},
              {"id"=>"57928212-721547628668287225",
               "title"=>"AltThisrs",
               "description"=>"",
               "iconlarge"=>
                "http://farm8.staticflickr.com/7024/cols/72157628668287225_190361d603_l.jpg",
               "iconsmall"=>
                "http://farm8.staticflickr.com/7024/cols/72157628668287225_190361d603_s.jpg",
               "set"=>
                [{"id"=>"721576328264334688",
                  "title"=>
                   "FebThis P)",
                  "description"=>""},
                 {"id"=>"721576306265468434",
                  "title"=>"Alt-ers - 15th Jul 2012",
                  "description"=>"(N-g A)"},
                 {"id"=>"721576303726416660",
                  "title"=>"A-n 2012",
                  "description"=>
                   "(NThis K)"},
                 {"id"=>"721576294666253333",
                  "title"=>"AThis2010",
                  "description"=>"(Thisl H)"},
                 {"id"=>"721576294990697063",
                  "title"=>"AThis10",
                  "description"=>"(This)"},
                 {"id"=>"721576299940655063",
                  "title"=>
                   "This008",
                  "description"=>"(NThis)"},
                 {"id"=>"721576429990712153",
                  "title"=>
                   "Event 2011 - 31st Oct-1st Nov 2011",
                  "description"=>"(This)"},
                 {"id"=>"721576295594429835",
                  "title"=>"This 29th-31st Oct 2009",
                  "description"=>"(ThisF)"},
                 {"id"=>"721576291947499268",
                  "title"=>
                   "Behi-l 2006",
                  "description"=>"(This)"},
                 {"id"=>"721576295411694365",
                  "title"=>"Day 2010 - 21st Jun 2010",
                  "description"=>"This)"}]}]}]},
        {"id"=>"57928212-721457628985775057",
         "title"=>"Yearly Events",
         "description"=>"",
         "iconlarge"=>"/images/collection_default_l.gif",
         "iconsmall"=>"/images/collection_default_s.gif",
         "collection"=>
          [{"id"=>"57928212-721576429836230144",
            "title"=>"This",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"721576299818309211",
               "title"=>"Here StThisees",
               "description"=>""},
              {"id"=>"721576296173454860",
               "title"=>"Thisats",
               "description"=>""}]},
           {"id"=>"57928212-721576258985777547",
            "title"=>"Birthdays",
            "description"=>"",
            "iconlarge"=>"/images/collection_default_l.gif",
            "iconsmall"=>"/images/collection_default_s.gif",
            "set"=>
             [{"id"=>"7215762899995365613",
               "title"=>"This12",
               "description"=>""}]}]},
        {"id"=>"57928212-721576298356236274",
         "title"=>"Misc",
         "description"=>"",
         "iconlarge"=>"/images/collection_default_l.gif",
         "iconsmall"=>"/images/collection_default_s.gif",
         "set"=>
          [{"id"=>"721576295511800621",
            "title"=>"This",
            "description"=>""},
           {"id"=>"721576295391565747",
            "title"=>"This",
            "description"=>""}]}]}]},
 "stat"=>"ok"}

在这件事上我真的可以帮忙。我认为这是数组和散列的多维方面,以及如何创建可以循环起来添加集合的东西。我现在需要忽略这些场景。集合将在稍后添加。

更新:

一直在玩这个游戏,试图慢慢弄清楚散列的每个部分是什么,并且有以下内容:

代码语言:javascript
复制
  def self.add_all
    tree = Flickr.collections_list['collections']
    puts "Got response from Flickr"
    tree.each do |c|
      c.each do |d|
        ap d.class
        #add_collection(d)
      end
    end

当我运行它时,d.class返回:

字符串<对象 数组<对象

我能访问数组部分吗?这样我就可以继续迭代了,因为我被告知不能对字符串执行.each (这很有意义)。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-21 20:54:40

是啊,真让人费解。你需要知道的是

  1. 顶级集合的数组位于tree["collections"]["collection"]
  2. 集合是包含每个属性(idtitledescription等)键的散列。
  3. 集合可能有一个名为collection (而不是collections)的键,其值是子集合的数组。

现在,根据这些准则,我们可以编写代码遍历树。我们递归地调用traverse_collection来处理子集合。

代码语言:javascript
复制
def traverse_collection(collection)
  Collection.create! :flickr_id => collection["id"],
    :title => collection["title"],
    :description => collection["description"]

  if collection["collection"]
    for child in collection["collection"]
      traverse_collection child
    end
  end
end

for collection in Flickr.collections_list["collections"]["collection"]
  traverse_collection collection
end
票数 3
EN

Stack Overflow用户

发布于 2013-12-25 18:22:01

jonahb完成了出色的工作,将Flickr响应的组件分解为上面可管理的部分。这里有一个更像Rubyesque的代码重构,使用each而不是for,它与rctneil的命名约定相匹配。

代码语言:javascript
复制
def self.add_collection(collection)
  Collection.create!( flicker_id: collection['id'], 
                      title: collection['title'], 
                      description: collection['description'] )
  collection['collection'].each { |sub_collection| add_collection sub_collection } if collection['collection']
end

def self.add_all
  collections = Flickr.collections_list["collections"]["collection"]
  collections.each { |collection| add_collection collection }
end

在处理深度嵌套的API响应时,我发现一个非常有用的工具是刺探。当我使用一个我不熟悉的新API时,我会在调用API之后立即删除一个binding.pry,并开始在控制台中对它进行剪切。它确实有助于获得一个坚实的句柄,使您能够尽早访问所需的内容,这样,当您坐下来编写代码时,它不会使您陷入困境。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20689698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档