我需要在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数据结构。我可以肯定地编写一个迭代器,使用点作为分隔符将字符串拆分为数组,逐项遍历它,但这看起来不像优雅的解决方案。
对更优雅方式的任何建议?
答案 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)