Ruby Json使用键

时间:2016-06-29 18:38:57

标签: ruby-on-rails ruby json

我正在尝试使用密钥从嵌套的JSON中检索一个值。

我的JSON结构如下:

enter image description here

如果我尝试:

puts person_id["name"]

它确实可以正常工作,但如果我尝试将电话值设为:

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

它不起作用。

如何正确访问phone value?特别是当primary字段为true时?

我尝试this但没有成功。提前谢谢。

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:3)

您的代码唯一的问题是,当您应该使用哈希密钥访问器.phone时,您尝试使用点方法访问器["phone"]

这是一个可以理解的错误。它适用于Javascript。

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

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

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

或者您可以使用recursive-open-struct gem:

RecursiveOpenStruct.new(nested_hash)