3

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

对更优雅的方式有什么建议吗?

4

2 回答 2

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"
于 2013-01-03T20:14:07.950 回答
1

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

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

http://stedolan.github.com/jq/

于 2013-01-03T20:27:24.370 回答