0

ハッシュの配列を作成できます。

people = [
  {"Name" => "J.R. Kruger", "State" => "WA"},
  {"Name" => "Carl Hennings", "State" => "CA"}
]

次に、次のeachステートメントを使用できます。

people.each { |p| puts p["Name"] }

期待どおりに名前のリストが表示されます。

"J.R. Kruger"
"Carl Hennings"

しかし、ハッシュの配列に解析される JSON オブジェクトの Web サービスを使用すると、次のようになります。

speakers = JSON.parse(open("http://some.url.com/speakers.json").read)

ハッシュの配列を返します。しかし、上記の人を表すハッシュの配列と同じことをしようとすると、次のようになります。

speakers.each {|s| puts s["SpeakerName"]}

"SpeakerName"これは、ハッシュの配列であり、配列内の各ハッシュのキーの値の予想されるリストではなく、スピーカーのコンテンツ全体のみを出力します。

私ができることを追加する必要があります:

speakers[0]["SpeakerName"] 

目的の結果が得られ、間違ったキーではないことが保証されます。

何が欠けていますか?


更新しました:

ファイルからの出力:

[
  {
    "Title"=>"Working with Maps in iOS 6: MapKit and CoreLocation in Depth",
    "Abstract"=>"Adding a Map to an App and recording a User\u2019s location as they use the App has become a common must have feature in may of todays popular applications. This presentation will go over the updated iOS 6 APIs for accomplishing such tasks including map annotations, dragging and dropping custom pins as well as delve into some of the finer aspects of the required location based calculations one needs to consider to find the center of the map or the distance between two points. Additionally the presentation will go over techniques to update a MapView with a moving object as well as positioning the image for the object properly along its heading. This will be a straight forward hands on development presentation with plenty of code examples.",
    "Start"=>"2013-01-11T20:35:00Z",
    "Room"=>"Salon A",
    "Difficulty"=>"Intermediate",
    "SpeakerName"=>"Geoffrey Goetz",
    "Technology"=>"Mac/iPhone",
    "URI"=>"/api/sessions.json/Working-with-Maps-in-iOS-6-MapKit-and-CoreLocation-in-Depth",
    "EventType"=>"Session",
    "Id"=>"4f248d87-0e18-488d-8cef-5e4130b8bb20",
    "SessionLookupId"=>"Working-with-Maps-in-iOS-6-MapKit-and-CoreLocation-in-Depth",
    "SpeakerURI"=>"/api/speakers.json/Geoffrey-Goetz"
  },
  {
    "Title"=>"Vendor Sessions - Friday",
    "Start"=>"2013-01-11T20:00:00Z",
    "End"=>"2013-01-11T20:20:00Z",
    "Room"=>"TBD",
    "Difficulty"=>"Beginner",
    "SpeakerName"=>"All Attendees",
    "Technology"=>"Other",
    "URI"=>"/api/sessions.json/Vendor-Sessions--Friday",
    "EventType"=>"Session",
    "Id"=>"43720cb8-d8ca-4694-8806-debcbdefa239",
    "SessionLookupId"=>"Vendor-Sessions--Friday",
    "SpeakerURI"=>"/api/speakers.json/All-Attendees"
  },
  {
    "Title"=>"Vendor Sessions - Thursday",
    "Start"=>"2013-01-10T20:00:00Z",
    "End"=>"2013-01-10T20:20:00Z",
    "Room"=>"TBD",
    "Difficulty"=>"Beginner",
    "SpeakerName"=>"All Attendees",
    "Technology"=>"Other",
    "URI"=>"/api/sessions.json/Vendor-Sessions--Thursday",
    "EventType"=>"Session",
    "Id"=>"2df202e4-219c-4efb-a838-3898d183dd19",
    "SessionLookupId"=>"Vendor-Sessions--Thursday",
    "SpeakerURI"=>"/api/speakers.json/All-Attendees"
  },
  {
    "Title"=>"Version your database on nearly any platform with Liquibase",
    "Abstract"=>"If you are still writing one-off scripts to manage your database, then it is time to make your life much simpler and less error-prone.  \nWe'll spend the time discussing Liquibase, a tool that will help you to manage that process.  It will even allow you to check your schema and seed data into source-control, and get new environments up and running quickly.  This session will focus not on the merits of using such a tool, but on its workflow and implementation in a project.  We'll run through the majority of features from the command-line, demonstrating that as long as a Java Runtime Environment (jre) is available, Liquibase can be used during deployments on any platform.  We'll also touch on usage with maven and quirks of Liquibase that are good to know ahead of time.",
    "Start"=>"2013-01-11T20:35:00Z",
    "Room"=>"Sagewood/Zebrawood",
    "Difficulty"=>"Beginner",
    "SpeakerName"=>"Daniel Bower",
    "Technology"=>"Continuous Deployment",
    "URI"=>"/api/sessions.json/Version-your-database-on-nearly-any-platform-with-Liquibase",
    "EventType"=>"Session",
    "Id"=>"4abb3869-bacd-42e1-93dc-14e712090b65",
    "SessionLookupId"=>"Version-your-database-on-nearly-any-platform-with-Liquibase",
    "SpeakerURI"=>"/api/speakers.json/Daniel-Bower"
  }
]
4

2 に答える 2

1

IRB または Pry を使用してデータとコードを調べていると思いますが、これは正しいことですが、環境の動作方法のために混乱を招く可能性もあります。

私は Pry を使用しています。あなたの配列を見て、'SpeakerName'各ハッシュからフィールドを抽出すると、次の 4 つが返されます。

[9] (pry) main: 0> ary.map{ |h| h['SpeakerName'] }
[
    [0] "Geoffrey Goetz",
    [1] "All Attendees",
    [2] "All Attendees",
    [3] "Daniel Bower"
]

配列を使用eachして繰り返し処理すると、4 つの名前が出力され、その後にそれぞれの戻り値が表示され、Pry が表示します。長くなりすぎたのでここで切り捨てました。

[10] (pry) main: 0> ary.each{ |h| puts h['SpeakerName'] }
Geoffrey Goetz
All Attendees
All Attendees
Daniel Bower
[
[0] {
              "Title" => "Working with Maps in iOS 6: MapKit and CoreLocation in Depth",...

;nilそれが戻り値であることを示すために、次の行に追加して、別の戻り値で Pry を騙しました。

[11] (pry) main: 0> ary.each{ |h| puts h['SpeakerName'] };nil
Geoffrey Goetz
All Attendees
All Attendees
Daniel Bower
nil

nil名前を出力した後、忠実に戻ってきたプライ。

この問題は、実行中のプログラムではなく、IRB または Pry でのみ発生します。

于 2013-01-20T16:13:43.020 に答える
0

答えは、実際に私がOPで提案したものとまったく同じであることが判明しました->結果は、Array#eachが配列を返すということです。

したがって、ブロックの実行後に配列全体を返すインスタンス変数で each を呼び出すと、同じ結果がたとえば(ビュー)に投稿されます。

ソースと、最終的に返される結果である配列を返す方法については、 Ruby API ドキュメントを参照してください。

于 2013-01-20T22:01:40.540 に答える