

jsonからの値を取り扱う際に、いつも以下の2通りのパターンのどちらなのかわからず混乱してしまいます。

hoge[:title]  
hoge.title

※キーに対するバリューを取得する際を想定

Jsonをパースした際のハッシュの取り扱い

[code]

    hoge = resp.body.map{|hoge| JSON.parse(hoge)}
    
    OK
    hoge[0].title
    
    NG
    hoge[0]["title"]
    
[/code]

一方、ハッシュを変数に入れる際？は

[code]

    hoge = {:id=>"123", :title=>"テスト"}
    
    OK
    hoge["title"]
    
    NG
    hoge.title
    
[/code]

変数に入れるか入れないかで挙動が違うのかなと思ったのですが、  
ピンポイントで解説している文献に出会わなかったため、質問させて頂きました。

また、hashでのfindの挙動も時々不思議に思うことがあります。  
こちらももし参考になるURlなどございましたら教えて頂けると幸いです。

宜しくお願いします。


CC BY-SA 3.0
2015-11-29T14:03:53.403
19440
2016-05-03T15:12:06.970
13175
question
ruby
hashの記法について(キーに対するバリューを取得する際、 hoge[:title] と hoge.title という二種類のやり方があり)

[code]

    hoge = resp.body.map{|hoge| JSON.parse(hoge)}
    
[/code]

が何に由来しているのかも中身が何かわからないので実際に起きていることはわかりませんが、素の`Hash`には

[code]

    hash.title
    
[/code]

のように、メソッド形式でキーを指定して値を指定するような機能はありません。出来るとしたらそれは`Hash`を拡張したものかまたは全く別のオブジェクトです。


CC BY-SA 3.0
2016-01-04T07:06:38.313
20577
2016-01-04T07:06:38.313
5793
19440
answer


あてずっぽうですが `JSON::Parser.new` の引数に独自のクラスを指定してるのではないでしょうか。

> new(source, options => {}) -> JSON::Parser[permalink][rdoc]
>
> :object_class  
>  JSON のオブジェクトを変換するクラスを指定します。デフォルトは Hash です。
>
> :array_class  
>  JSON の配列を変換するクラスを指定します。デフォルトは Array です。

<http://docs.ruby-lang.org/ja/2.1.0/method/JSON=3a=3aParser/s/new.html>


CC BY-SA 3.0
2016-01-04T12:12:58.070
20596
2016-01-04T12:12:58.070
5008
19440
answer