我试图弄清楚如何从Rails中的哈希返回中获取第二级或子级...例如
这是我使用Koala gem为Facebook收到的回报;
{"id"=>"28898790358_10152709083080359", "from"=>{"category"=>"Tv channel", "category_list"=>[{"id"=>"169056916473899", "name"=>"Broadcasting & Media Production"}], "name"=>"WGRZ - Channel 2, Buffalo", "id"=>"28898790358"}, "message"=>"Doctors remove 9-pound hairball from teen's stomach\nhttp://on.wgrz.com/1E12vpO", "picture"=>"https://fbexternal-a.akamaihd.net/safe_image.php?d=AQBYojdoFNbt05n5&w=158&h=158&url=http%3A%2F%2Fwww.gannett-cdn.com%2F-mm-%2Fe61500963820949c2654e6f754a9cd9d857b9f39%2Fc%3D0-238-3600-2268%26r%3Dx1803%26c%3D3200x1800%2Flocal%2F-%2Fmedia%2FUSATODAY%2FNone%2F2014%2F10%2F01%2F1412178695000-AFP-511998799.jpg", "link"=>"http://on.wgrz.com/1E12vpO", "name"=>"Doctors remove 9-pound hairball from teen's stomach", "caption"=>"www.usatoday.com", "description"=>"Kyrgyzstan girl, 18, was a habitual hair-chewer.", "icon"=>"https://fbstatic-a.akamaihd.net/rsrc.php/v2/y5/r/sXJx2UP7quc.png", "actions"=>[{"name"=>"Comment", "link"=>"https://www.facebook.com/28898790358/posts/10152709083080359"}, {"name"=>"Like", "link"=>"https://www.facebook.com/28898790358/posts/10152709083080359"}], "privacy"=>{"value"=>""}, "type"=>"link", "status_type"=>"shared_story", "created_time"=>"2014-10-01T19:19:08+0000", "updated_time"=>"2014-10-01T20:11:12+0000", "shares"=>{"count"=>75}, "likes"=>{"data"=>[{"id"=>"488026128001691", "name"=>"Liz Moeller"}, {"id"=>"10205169852351610", "name"=>"Anna Grazier"}, {"id"=>"591157491006916", "name"=>"Vanessa Huffer"}, {"id"=>"561759850622478", "name"=>"Ann Dante"}, {"id"=>"405685782913011", "name"=>"John Potempa"}, {"id"=>"10154648653570585", "name"=>"Joseph Braun"}, {"id"=>"825528997467246", "name"=>"Thomas Carney"}, {"id"=>"293748604151538", "name"=>"Tina Lazore"}, {"id"=>"10152796932723417", "name"=>"Patricia Fitzgerald Barnett"}, {"id"=>"840433475988223", "name"=>"Jessica Miller"}, {"id"=>"279812638893831", "name"=>"Alzina Roberta"}, {"id"=>"10152445879728226", "name"=>"Christina Joseph"}, {"id"=>"10152741973777766", "name"=>"Jenna Cipolla"}, {"id"=>"837871439580332", "name"=>"David Stubbe"}, {"id"=>"755004064560020", "name"=>"Dona M Blajszczak-Rosinski"}, {"id"=>"697656466970724", "name"=>"April Grigajtis"}, {"id"=>"992375559771", "name"=>"Joseph Rühlmann"}, {"id"=>"10204337209284065", "name"=>"Mike Mathieu"}, {"id"=>"848815905129472", "name"=>"Sue Graczyk Sobierajski"}, {"id"=>"930272426990088", "name"=>"Kenny L Motyka"}, {"id"=>"10203916182179015", "name"=>"Jessa Maeven Collins"}, {"id"=>"10152791313896477", "name"=>"Laura Cote"}, {"id"=>"10152683859774000", "name"=>"Sarah Beana"}, {"id"=>"10205227793438942", "name"=>"Sara Johnson-Molloy"}, {"id"=>"10204985250058770", "name"=>"Chrissy Meginley Stewart"}], "paging"=>{"cursors"=>{"after"=>"MTAyMDQ5ODUyNTAwNTg3NzA=", "before"=>"NDg4MDI2MTI4MDAxNjkx"}, "next"=>"https://graph.facebook.com/v2.1/28898790358_10152709083080359/likes?access_token=CAAKErEce2PkBAMZCH84asPkqOoptXt8KZBtFfkxOZAwZBTEG1sV8XLmaO75aahncO7HDJngtGFBGSEG1qYNLezwjHrJoKtTkLhFXuloGpbwAwtLnviZB2OZAz67QWDZC9oAw6UQ6MAFEAxNKoIyIZAKET0hKsjxKzE5QZAr1sO6GMiE4vBeYxVooqpuiHLZC1xsgPNyZBIdBATPvXF10aKEE7FC&limit=25&after=MTAyMDQ5ODUyNTAwNTg3NzA%3D"}}, "comments"=>{"data"=>[{"id"=>"10152709083080359_10152709086210359", "from"=>{"id"=>"1564134453806193", "name"=>"Linda Grillo"}, "message"=>"Omg", "can_remove"=>false, "created_time"=>"2014-10-01T19:21:20+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709088725359", "from"=>{"id"=>"10152378415284135", "name"=>"Stephanie Cooper"}, "message"=>"Sarah Cooper", "message_tags"=>[{"id"=>"10203592686995505", "name"=>"Sarah Cooper", "type"=>"user", "offset"=>0, "length"=>12}], "can_remove"=>false, "created_time"=>"2014-10-01T19:22:42+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709088950359", "from"=>{"id"=>"854070524605948", "name"=>"Alex Sharkey"}, "message"=>"That's a pretty strange addiction but glad she doesn't have 9lbs of hair in her stomach anymore.", "can_remove"=>false, "created_time"=>"2014-10-01T19:22:51+0000", "like_count"=>3, "user_likes"=>false}, {"id"=>"10152709083080359_10152709089390359", "from"=>{"id"=>"10100530741292425", "name"=>"Kailey Wood"}, "message"=>"John Wood", "message_tags"=>[{"id"=>"935102101201", "name"=>"John Wood", "type"=>"user", "offset"=>0, "length"=>9}], "can_remove"=>false, "created_time"=>"2014-10-01T19:22:59+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709090915359", "from"=>{"id"=>"580045458766925", "name"=>"Arlene Marie Garnham"}, "message"=>"Weird.", "can_remove"=>false, "created_time"=>"2014-10-01T19:24:02+0000", "like_count"=>1, "user_likes"=>false}, {"id"=>"10152709083080359_10152709091150359", "from"=>{"id"=>"644407049009877", "name"=>"Winnie Cooper"}, "message"=>"Wait.......what??", "can_remove"=>false, "created_time"=>"2014-10-01T19:24:13+0000", "like_count"=>2, "user_likes"=>false}, {"id"=>"10152709083080359_10152709092995359", "from"=>{"id"=>"10204886399418898", "name"=>"Debbie Lynn Rich"}, "message"=>"Shut the front door..that is hysterical!!", "can_remove"=>false, "created_time"=>"2014-10-01T19:25:38+0000", "like_count"=>2, "user_likes"=>false}, {"id"=>"10152709083080359_10152709093670359", "from"=>{"id"=>"10203002544480437", "name"=>"Michelle Mumothree"}, "message"=>"Um....meow", "can_remove"=>false, "created_time"=>"2014-10-01T19:25:59+0000", "like_count"=>7, "user_likes"=>false}, {"id"=>"10152709083080359_10152709095930359", "from"=>{"id"=>"851786061533069", "name"=>"Danny Barger"}, "message"=>"that's just nasty an crazy ", "can_remove"=>false, "created_time"=>"2014-10-01T19:27:18+0000", "like_count"=>1, "user_likes"=>false}, {"id"=>"10152709083080359_10152709096430359", "from"=>{"id"=>"950617844952060", "name"=>"Nicole N Ryan Kroll"}, "message"=>"Nomnomnom add a little butter", "can_remove"=>false, "created_time"=>"2014-10-01T19:27:40+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709097245359", "from"=>{"id"=>"10204139630885286", "name"=>"Amy Choops Vealey"}, "message"=>"Effin disgusting", "can_remove"=>false, "created_time"=>"2014-10-01T19:28:07+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709097350359", "from"=>{"id"=>"880716621940584", "name"=>"Rob Kozak"}, "message"=>"ThTs why girls should shave down there!", "can_remove"=>false, "created_time"=>"2014-10-01T19:28:14+0000", "like_count"=>5, "user_likes"=>false}, {"id"=>"10152709083080359_10152709099970359", "from"=>{"id"=>"861465223872493", "name"=>"Bruce Rifenburg"}, "message"=>"Nervous girl huh!", "can_remove"=>false, "created_time"=>"2014-10-01T19:30:00+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709100600359", "from"=>{"id"=>"10203632325781260", "name"=>"Michelle Carlson Stephens"}, "message"=>"This is news ???", "can_remove"=>false, "created_time"=>"2014-10-01T19:30:34+0000", "like_count"=>1, "user_likes"=>false}, {"id"=>"10152709083080359_10152709100930359", "from"=>{"id"=>"798111513586382", "name"=>"Gayle Carey Balko"}, "message"=>"I new of a little girl who died of a bowel obstruction because she would bite her nails and had a habit of putting the end of her braids in her mouth. They found this large hair all and nails in her stomach. I will never forget it. That is why when I see little ones sucking on their hair I tell the parents that story!", "can_remove"=>false, "created_time"=>"2014-10-01T19:30:44+0000", "like_count"=>1, "user_likes"=>false}, {"id"=>"10152709083080359_10152709101730359", "from"=>{"id"=>"10204826234725533", "name"=>"Deborah Szlis"}, "message"=>"Gross", "can_remove"=>false, "created_time"=>"2014-10-01T19:31:13+0000", "like_count"=>1, "user_likes"=>false}, {"id"=>"10152709083080359_10152709104225359", "from"=>{"id"=>"992445030551", "name"=>"Kimberlee Ann"}, "message"=>"Maybe pica? It's a disorder where people eat things that aren't food. http://en.m.wikipedia.org/wiki/Pica_(disorder)", "can_remove"=>false, "created_time"=>"2014-10-01T19:33:12+0000", "like_count"=>3, "user_likes"=>false}, {"id"=>"10152709083080359_10152709104515359", "from"=>{"id"=>"10152706603435269", "name"=>"Kerry Murphy"}, "message"=>"Sounds like this child has some major mental issues", "can_remove"=>false, "created_time"=>"2014-10-01T19:33:23+0000", "like_count"=>1, "user_likes"=>false}, {"id"=>"10152709083080359_10152709105985359", "from"=>{"id"=>"809049082479473", "name"=>"Mary Beth Lazarski"}, "message"=>"Was it the kid that wanted his yearbook picture of him with his cat?", "can_remove"=>false, "created_time"=>"2014-10-01T19:34:28+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709106880359", "from"=>{"id"=>"775845355790712", "name"=>"Jim Sweetness McDonald Jr."}, "message"=>"Jenn Santiago", "message_tags"=>[{"id"=>"10152709167887440", "name"=>"Jenn Santiago", "type"=>"user", "offset"=>0, "length"=>13}], "can_remove"=>false, "created_time"=>"2014-10-01T19:35:02+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709107365359", "from"=>{"id"=>"798111513586382", "name"=>"Gayle Carey Balko"}, "message"=>"I worked in a kindergarten and you would be surprised how often kids do this!", "can_remove"=>false, "created_time"=>"2014-10-01T19:35:21+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709108230359", "from"=>{"id"=>"10152290902876268", "name"=>"Jessica Caplick"}, "message"=>"Weird...and rather gross. ", "can_remove"=>false, "created_time"=>"2014-10-01T19:35:56+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709111890359", "from"=>{"id"=>"773933259333099", "name"=>"Deepthi Koneru"}, "message"=>"Stop judging people..before u make nasty or sarcastic comment just get to know why she is doing it ..it's a disorder called trichtilomania.", "can_remove"=>false, "created_time"=>"2014-10-01T19:38:14+0000", "like_count"=>5, "user_likes"=>false}, {"id"=>"10152709083080359_10152709113670359", "from"=>{"id"=>"10203916182179015", "name"=>"Jessa Maeven Collins"}, "message"=>"Pica", "can_remove"=>false, "created_time"=>"2014-10-01T19:39:19+0000", "like_count"=>0, "user_likes"=>false}, {"id"=>"10152709083080359_10152709113680359", "from"=>{"id"=>"839132992775340", "name"=>"Tim Hunter"}, "message"=>"This girl has significant anxiety more than likely. It's not weird, it's not gross, it's a serious disorder. Grow up people", "can_remove"=>false, "created_time"=>"2014-10-01T19:39:20+0000", "like_count"=>8, "user_likes"=>false}], "paging"=>{"cursors"=>{"after"=>"MjU=", "before"=>"MQ=="}, "next"=>"https://graph.facebook.com/v2.1/28898790358_10152709083080359/comments?access_token=CAAKErEce2PkBAMZCH84asPkqOoptXt8KZBtFfkxOZAwZBTEG1sV8XLmaO75aahncO7HDJngtGFBGSEG1qYNLezwjHrJoKtTkLhFXuloGpbwAwtLnviZB2OZAz67QWDZC9oAw6UQ6MAFEAxNKoIyIZAKET0hKsjxKzE5QZAr1sO6GMiE4vBeYxVooqpuiHLZC1xsgPNyZBIdBATPvXF10aKEE7FC&limit=25&after=MjU%3D"}}}
我可以使用something["from"]["category"]
抓住它...但是试图抓住例如something["shares"]["count"]
.......我收到错误undefined method
[] '为零:NilClass`
执行something["shares"]
确实会返回--- count: 73
的值,并且我已经读过count
可能是 sub 的内容或其他内容。
有关如何检索shares -> count
号码的任何建议吗?
模型中的示例代码或逻辑,用于为facebook中每个返回的home
帖子创建数据库条目;
def self.pull
pull = user.facebook.get_connection("me", "home")
// above returns a long hash and for many stories on the homepage of facebook
// so for each story we pull i want to grab few items from the hash
// for example the share count
pull.each do |story|
user.model.create({story_id: story[:id], shares_count: story["shares"]["count"], author: story["from"]["name"]})
end
// the above works for the story[:id] and for story["from"]["name"] but not on story["shares"]["count"]
end
答案 0 :(得分:3)
正如评论中提到的,这不是哈希,它是哈希的JSON序列化,因此您首先需要将其解析回Ruby对象:
require 'json'
json = '{"data":[{"id":1,"from":{"category":"Musician/band"}}]}'
hash = JSON[json]
Ruby的JSON类是标准库的一部分,非常易于使用。基本上你可以传递JSON[...]
一个字符串,它会尝试将它解析回一个对象,或者传递一个对象,它会将序列化的对象返回一个字符串。它是解析和序列化最灵活的方式。
此时,hash
是哈希:
hash.class # => Hash
并且,您可以深入研究它以访问它包含的内容:
hash['data'].first['id'] # => 1
为了方便起见,不是编写更长和更长的键和索引链,而是将一个元素赋值给变量:
from = hash['data'].first['from'] # => {"category"=>"Musician/band"}
from
成为哈希和数组的占位符,可以轻松处理特定元素:
from['category'] # => "Musician/band"
你应该养成使用IRB或Pry来捅东西的习惯,并使用简化的数据样本来防止它变得笨拙,至少在你习惯使用JSON和哈希之前是这样。例如,这里是Pry中的会话:
[1] (pry) main: 0> require 'json'
true
[2] (pry) main: 0> json = '{"data":[{"id":1,"from":{"category":"Musician/band"}}]}'
"{\"data\":[{\"id\":1,\"from\":{\"category\":\"Musician/band\"}}]}"
[3] (pry) main: 0> hash = JSON[json]
{
"data" => [
[0] {
"id" => 1,
"from" => {
"category" => "Musician/band"
}
}
]
}
[4] (pry) main: 0> hash.class
Hash < Object
[5] (pry) main: 0> hash['data'].first['id']
1
[6] (pry) main: 0> from = hash['data'].first['from']
{
"category" => "Musician/band"
}
[7] (pry) main: 0> from['category']
"Musician/band"
您可以轻松调查如何访问结构,而无需编辑文件并运行它。
答案 1 :(得分:0)
可能是你在nil对象上尝试哈希操作。你应该在从对象获取数据之前检查nil条件。
If something or something["shares"] is nil
Then something["shares"]["count"]
returns ==> NoMethodError: undefined method `[]' for nil:NilClass
检查无条件&amp;继续这可能会对你有帮助。