如何从Ruby中的JSON获取特定字段

时间:2013-01-03 20:01:06

标签: json ruby jq

我需要在Ruby中实现一个简单的shell实用程序,它从文件中解析JSON并从中返回一个特定的字段。

要解析的JSON示例:

{"status": "fail", "messages": ["Out of capacity"]}

{"status": "success", "messages": [], "result": {"node": {"ip": "1.2.3.4", "description": "", "id": 974, "name": "VM#3"}}}

想法是创建一个包含两个参数的CLI实用程序:要读取的JSON文件和要从中提取的JSON字段:

./get_json_field.rb ~/tmp.XXXXXX 'result.node.ip'
./get_json_field.rb ~/tmp.XXXXXX 'messages.0'

我正在努力如何将第二个参数映射到Ruby中的解析JSON数据结构。我可以肯定地编写一个迭代器,使用点作为分隔符将字符串拆分为数组,逐项遍历它,但这看起来不像优雅的解决方案。

对更优雅方式的任何建议?

2 个答案:

答案 0 :(得分:2)

分割字符串并浏览部分字符串没有错:

require 'json'

data1 = JSON.load('{"status": "fail", "messages": ["Out of capacity"]}')
data2 = JSON.load('{"status": "success", "messages": [], "result": {"node": {"ip": "1.2.3.4", "description": "", "id": 974, "name": "VM#3"}}}')

def get_from_json(data, query)
  query.split('.').inject(data) do |memo, key|
    key = key.to_i if memo.is_a? Array
    memo.fetch(key)
  end
end

get_from_json(data1, 'messages.0')        # => "Out of capacity"
get_from_json(data2, 'result.node.ip')    # => "1.2.3.4"

答案 1 :(得分:1)

看看jq它可能已经在你正在寻找的东西。

jq .messages[0]
jq .node.message.ip

请参阅http://stedolan.github.com/jq/