2016-06-29 52 views
0

我试图从嵌套JSON使用密钥获取一个值。Ruby Json使用密钥访问嵌套元素

JSON结构如下:

enter image description here

如果我尝试:

puts person_id["name"] 

它做工精细,但这时如果我试图让手机值:

person_id.phone[0].["value"] 

它不起作用。

我该如何正确访问phone value?特别是当primary字段是true?我试过this但没有成功。提前致谢。

+1

欢迎堆栈溢出。不要使用图像来表示充当代码输入的数据。我们不能重复使用,必须输入,这会立即关闭您的潜在帮助。此外,链接可能会破坏然后中断,让你的问题没有意义。请阅读“[问]”,包括链接的页面和“[mcve]”。 –

+1

@锡人解释了为什么你不应该发布代码的图像。我低估了你的问题,因为你看到了他的评论,却选择了忽略他的建议。即使你选择了答案,你也应该按照他的建议去做,因为很多SO成员将来可能会阅读你的问题。另外,请删除破折号并为哈希指定一个变量(例如,'hash = {...}'),以便读者既可以剪切,粘贴也可以引用该变量而不必定义它。我将删除你编辑的downvote。 –

回答

3

与唯一的问题你代码是当您应该使用散列键访问器["phone"]时,您试图使用点方法访问器.phone

这是一个可以理解的错误。它会在Javascript中工作。

添加此功能实际上并不困难。 Ruby有OpenStruct类,它是一个类似哈希的对象,可以自动添加点方法访问器。你只需要require ostruct,这是标准库的一部分。

你可以告诉JSON.parse自动所有哈希值转换为OpenStructs(source):

object = JSON.parse(json, object_class: OpenStruct) 

或者你可以使用recursive-open-struct宝石:

RecursiveOpenStruct.new(nested_hash) 
3

从外观看,person_id是一个散列,字符串键为"name""email""phone"。键"phone"的值是一个数组,其中的每个元素都是带有键"label""value""primary"的散列。在这种情况下,你想要的是这样的:

phone_array = person_id["phone"] 
# => [ { "label" => "Work", ... }, ... ] 

first_phone = phone_array[0] 
# => { "label" => "Work", ... } 

first_phone_value = first_phone["value"] 
# => "+0109135008" 

当然,你正在寻找一种方式,一条线要做到这一点,它看起来像这样:

person_id["phone"][0]["value"] 
# => "+0109135008" 
+0

谢谢乔丹。它真的有效。然后,我不需要做任何改变即可获得活动手机,因为当前手机将始终处于0级别。 再次感谢。 –