如何使用一串javascript从Ruby中的哈希中选择键?

时间:2014-12-31 15:09:13

标签: javascript ruby json gem hash

我正在使用Ruby中的命令行工具,该工具从各种来源解析JSON并对数据进行一些处理。我希望用户能够将该工具与任何JSON源一起使用,因此gem从用户提供的YAML文件中读取一些基本配置,如下所示:

# config.yml

json_sources:
  sourcea:
    url: 'https://example.com/some/json/api.json'
    list_key: 'response.items'
    name_key: 'name'
  sourceb:
    url: 'https://otherexample.org/another/api.json'
    list_key: ''
    name_key: 'basics.name'

在此示例中,从https://example.com/some/json/api.json返回的JSON看起来像这样:

{
  "response": {
    "items": [
      {
        "id": 1,
        "name": 'Item 1'
      },
      {
        "id": 2,
        "name": 'Item 2'
      }
    ]
  }
}

来自https://otherexample.org/another/api.json的JSON看起来像这样:

[
  {
    "basics": {
      "name": "Other Item 1"
    }
  },
  {
    "basics": {
      "name": "Other Item 2"
    }
  }
]

在每种情况下,url是JSON的URI,list_key是应该在JSON中迭代的密钥,而name_key是我们要从中获取的密钥每个对象。 所以,我的问题是,在Ruby中,我应该如何解析list_keyname_key

在Ruby中是否有一些方便的方法来使用一串javascript样式选择器获取哈希中键的值,或者我应该自己为它编写一个方法?

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我最喜欢Javascript的一个方面是您可以使用object.property以及object["property"]访问对象的属性。在Ruby中,您只能使用hash["value"]访问哈希值。

要回答您的问题,您需要找到一种转换list_keyname_key的方法,以便它可以在Ruby中运行。最好的方法取决于你如何处理JSON的解析,但我应该像将list_keyname_key分成一堆蜇然后一样简单在哈希上访问这些值。

希望有所帮助。

答案 2 :(得分:0)

由于还没有人有更好的答案,我只是继续写了一个方法:

def get_value_from_selector(hash, selector_string)
  selectors = selector_string.split '.'
  selectors.each do |selector|
    hash = hash[selector] if hash
  end
  hash
end

我称之为:

raw_json_string = '{ "response": { "name": "foo" } }'
json = JSON.parse raw_json_string
x = get_value_from_selector json, 'response.name'

这会将x设置为'foo'

此方法有效,但它不支持['square_bracket']表示法或任何其他javascript。我确定我可以修改方法以便以后再做,但现在可行。