2014-10-02 73 views
1

我得到TypeError: no implicit conversion of String into Integer無法弄清楚這裏有什麼問題。如何獲取JSON對象的部分

require 'json' 

h = '{"name":[{"first":"first ", "last":"last"}], "age":2}' 
h = JSON.parse(h) 

class C 
    def fullname(p)  
    first(p["name"]) + last(p["name"]) 
    end 
    def age(p) 
    p["age"] 
    end 

private 
    def first(name) 
    name["first"] 
    end 
    def last(name) 
    name["last"] 
    end 
end 

C.new.age(h) #=> 2 
C.new.fullname(h) #=> TypeError: no implicit conversion of String into Integer 

回答

1

名稱是一個數組,你有兩個選擇:

選項A:

給全稱數組的元素:

def fullname(elem)  
    first(elem) + last(elem) 
end 

和呼叫它與

C.fullname(p.first) 

例如

選項B:

假設它總是陣列的全稱第一元件

def fullname(p) 
    name=p["name"].first 
    first(name) + last(name) 
end 

不要被Array.first混淆這是陣列[ 0]和你的'第一'函數

+0

@sawa這是因爲解釋器試圖將字符串(「第一」)轉換爲數組中的索引。 [1,2,3] [「name」]也會發生同樣的情況 – tomsoft 2014-10-02 09:43:38

+0

我的評論應用於編輯之前陳述的OP問題。現在,問題已經改變,你的答案沒有問題。我沒有意識到,當我給你寫評論時,我甚至不知道你的答案是在編輯之前還是之後發佈的。 – sawa 2014-10-02 09:47:18

1

h["name"]結果是name = [{"first" => "first ", "last" => "last"}],其是一個數組。您不能申請name["first"]name["last"]。傳遞給數組的參數必須是整數。

0

"name"是一個數組。 fullname(p)應該讀

first(p["name"][0]) + last(p["name"][0])