2017-01-21 1 views
0

'이름'키의 모든 값을 가져오고 동시에 '하위 키'값을 가져와야합니다. 첫 번째 레벨에서 '이름'만 검색 할 수 있지만 모든 '이름'에 해당하는 것이 아니므로 '아동'으로 붙어 있습니다.json에서 특정 키 값을 얻으려면 어떻게해야합니까?

puts data['labels'].collect { |item| item['name'] } 

JSON 응답은 다음과 같다 : 당신의 키, 문자열 기호를하지 않기 때문에

{"labels": [{ 
    "name": "Crime" 
}, { 
    "name": "Demonstrations" 
}, { 
    "name": "Music", 
    "children": [{ 
     "name": "Awards" 
    }, { 
     "name": "Classical" 
    }, { 
     "name": "Country" 
    }, { 
     "name": "Other" 
    }, { 
     "name": "Pop" 
    }, { 
     "name": "Soul" 
    }, { 
     "name": "X Factor" 
    }] 
}, { 
    "name": "Politics" 
}, { 
    "name": "Rescue" 
}, { 
    "name": "Special Events" 
}, { 
    "name": "Sports", 
    "children": [{ 
     "name": "Auto Racing" 
    }, { 
     "name": "Awards" 
    }, { 
     "name": "Baseball" 
    }, { 
     "name": "Basketball" 
    }, { 
     "name": "NASCAR (Cup)" 
    }, { 
     "name": "NASCAR (Nationwide)" 
    }, { 
     "name": "NASCAR (Truck)" 
    }, { 
     "name": "NASCAR (XFINITY)" 
    }, { 
     "name": "Other" 
    }, { 
     "name": "Rodeo" 
    }, { 
     "name": "Rugby" 
    }, { 
     "name": "Running" 
    }, { 
     "name": "Sailing" 
    }, { 
     "name": "Skating" 
    }, { 
     "name": "Volleyball" 
    }] 
}, { 
    "name": "Traffic" 
}, { 
    "name": "Weather" 
}]} 

답변

2
puts data['labels'].collect { |item| item['name'] } 

오류를

NoMethodError: undefined method `map' for nil:NilClass 

발생합니다.

와 '어린이'키

당신이 키를 얻을 하시겠습니까 값을 얻을 수있는 동시에 또한

? 모든 키가 동일하기 때문에 (:name). 가치가 필요한가요? 어쨌든 키가 필요한 경우 valueskeys 아래의 솔루션으로 변경하십시오.

지금 용액 (안전 네비게이터 (&)를 사용하여) :

data[:labels].map { |item| [item[:name], item[:children]&.map(&:values)] } 
# => [["Crime", nil], 
#  ["Demonstrations", nil], 
#  ["Music", ["Awards", "Classical", "Country", "Other", "Pop", "Soul", "X Factor"]], 
#  ["Politics", nil], 
#  ["Rescue", nil], 
#  ["Special Events", nil], 
#  ["Sports", ["Auto Racing", "Awards", "Baseball", "Basketball", "NASCAR (Cup)", "NASCAR (Nationwide)", "NASCAR (Truck)", "NASCAR (XFINITY)", "Other", "Rodeo", "Rugby", "Running", "Sailing", "Skating", "Volleyball"]], 
#  ["Traffic", nil], 
#  ["Weather", nil] 
# ] 

안전 네비게이터를 사용하지 않고 위의 솔루션 : 당신의 해시

data[:labels].map { |item| [item[:name], item[:children] ? item[:children].map(&:values) : nil] } 
+0

Andrey, p data [ 'labels']. 수집 {| item | item [ 'name']} 나에게 오류를 던지지는 않지만 모든 'name'의 값을 가져 오지만 'children'과 관련된 'name'은 무시합니다. 나는 루비 2.1.2에 있고 내비게이션 운영자는 나의 경우에는 지원되지 않는다. (( –

+0

@DenisS. 나는 대답을 편집했다. –

+0

Andrey! 고맙다. 내가 얻으려고했던 것이 정확히 –

1

h 경우에, 당신은 쓸 수

h[:labels].map do |f| 
    g = { name: f[:name] } 
    f.key?(:children) ? g.merge(children: f[:children].flat_map(&:values)) : g 
end 
    #=> [{:name=>"Crime"}, 
    # {:name=>"Demonstrations"}, 
    # {:name=>"Music", 
    #  :children=>["Awards", "Classical", "Country", "Other", "Pop", "Soul", "X Factor"] 
    # }, 
    # {:name=>"Politics"}, 
    # {:name=>"Rescue"}, 
    # {:name=>"Special Events"}, 
    # {:name=>"Sports", 
    #  :children=>["Auto Racing", "Awards", "Baseball", "Basketball", "NASCAR (Cup)", 
    #     "NASCAR (Nationwide)", "NASCAR (Truck)", "NASCAR (XFINITY)", "Other", 
    #     "Rodeo", "Rugby", "Running", "Sailing", "Skating", "Volleyball"] 
    # }, 
    # {:name=>"Traffic"}, 
    # {:name=>"Weather"} 
    # ] 

여기에는 Hash#key?, Hash#merge, Enumerable#flat_map 및 몇 가지 더 일반적인 것들.

+0

Thanks Cary , 불행하게도 저는 루비 2.1.2를 사용하고 있습니다. (( –

+0

Denis, 안전한 네비게이션 연산자를 사용하지 않았습니다.) 아마도 @Andrey에 대한 귀하의 의견을 의도 한 것일 수도 있습니다. –

+0

oooops, my 나쁜 Cary.You 맞아) 나는 당신의 대답을 고맙다) 감사합니다 –

관련 문제