3

ファイルから JSON を解析し、そこから特定のフィールドを返す単純なシェル ユーティリティを Ruby で実装する必要があります。

解析する JSON の例:

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

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

アイデアは、次の 2 つのパラメーターを持つ CLI ユーティリティを作成することです。読み取る JSON ファイルと、JSON から抽出するフィールドです。

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

Rubyで2番目のパラメーターを解析された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 に答える