1. ホーム
  2. スクリプト・コラム
  3. ルビートピックス

RubyおよびRuby on RailsでJSON形式のデータをパースするためのチュートリアルの例

2022-01-31 01:14:48

RubyでJSONをパースする
RubyによるJsonのパース例です。

json = '["a", "B", "C"]'
puts "Unsafe #{unsafe_json
(json).inspect}" 
#output Unsafe 
["a", "B", "C"] 


RubyはJsonを解析して、上記のjson文字列をArrayにパースしていますが、このような方法は安全ではありません。

json = 'puts "Danger 
Will Robinson"' 
puts "Unsafe #{unsafe_json
(json).inspect}" 


また何を出力すればいいのでしょうか?残念ながら、何もパースされず、警告が表示されます:warning: character class has `[' without escape safe as follows.

module SafeJSON  
require 'monitor'  
def SafeJSON.build_safe_json  
ret = nil  
waiter = ''  
waiter.extend(MonitorMixin)  
wait_cond = waiter.new_cond  
Thread.start do  
$SAFE = 4  
ret = Proc.new {|json|  
eval(json.gsub(/(["'])/s*:/s*
(['"0-9tfn/[{])/){"#{$1}=>#{$2}"}) }  
waiter.synchronize do wait_cond.signal  
end  
end 
waiter.synchronize do wait_
cond.wait_while { ret.nil? } end  
return ret  
end  
@@parser = SafeJSON.build_safe_json  
# Safely parse the JSON input  
def SafeJSON.parse(input)  
@@parser.call(input)  
rescue SecurityError  
return nil  
end 
end 


このModuleを入れると、RubyでJsonをこんな風にパースできるようになります。

peoples=SafeJSON.parse('
{"people":[{"name":"site120","
email":"[email protected]","sex":"male"},
{"name":"site120_2","email":"site1
[email protected]_2","sex":"male_2"}]}') 
puts peoples["people"][1]["name"]
 #output site120_2 



Ruby on Railsの場合
railsはRJSによるAJAXのサポートが組み込まれているので、jsonを使う機会はあまりないかもしれませんが、データ交換のための便利なフォーマットとして、以下のようなものがあります。

ここではJsonプラグインを使用しており、インストールコマンドは

gem install json_pure


使用例です。

 require "open-uri"
 require 'json'

 def index
  uri = '*****'
  response = nil
  begin
   open(uri) do |http|
    response = http.read
   end
   @json = JSON::parse(response)
  rescue => text
   # Exception handling
   logger.error("GetMailListserror=" + text)
   flash.now[:error] = 'Failed to get mailing list.'
  end
 end



ここでは、json パーサーは json フォーマットのキーが引用されていることを要求しています。