阅读936 返回首页    go 阿里云 go 技术社区[云栖]


使用ruby解析json

rails1.1已经加入对json的全面支持,现在的Array,Hash,String,Object...等等都有一个to_json方法,生成 json字符串。反过来,我们该如何解析json呢?查了下https://www.json.org/上面ruby语言的链接,在rubyforge上找到了一个项目。解析json对ruby来说非常简单,只要一行代码:



例子:

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






把上面的json字符串解析成Array。这样的方法并不安全,比如:

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







又该输出什么呢?很遗憾,解析不出什么东西,跳出一个警告:
warning: character class has `[' without escape


安全的方法如下:

None.gifmodule SafeJSON
None.gif  require 
'monitor'
None.gif  def SafeJSON.build_safe_json
None.gif    ret 
= nil
None.gif    waiter 
= ''
None.gif    waiter.extend(MonitorMixin)
None.gif    wait_cond 
= waiter.new_cond
None.gif    
None.gif    Thread.start 
do
None.gif      $SAFE 
= 4
ExpandedBlockStart.gifContractedBlock.gif      ret 
= Proc.new dot.gif{|json|
ExpandedSubBlockStart.gifContractedSubBlock.gif        eval(json.gsub(
/(["'])/s*:/s*(['"0-9tfn/[dot.gif{])/)dot.gif{"#{$1}=>#{$2}"})
ExpandedSubBlockEnd.gif      }

InBlock.gif      waiter.synchronize 
do
InBlock.gif        wait_cond.signal
InBlock.gif      end
InBlock.gif    end
InBlock.gif    waiter.synchronize 
do
ExpandedSubBlockStart.gifContractedSubBlock.gif      wait_cond.wait_while 
dot.gif{ ret.nil? }
InBlock.gif    end
InBlock.gif    
return ret
InBlock.gif  end
InBlock.gif  @@parser 
= SafeJSON.build_safe_json
InBlock.gif  
InBlock.gif  # Safely parse the JSON input
InBlock.gif  def SafeJSON.parse(input)
InBlock.gif    @@parser.call(input)
InBlock.gif  rescue SecurityError
InBlock.gif    
return nil
InBlock.gif  end
InBlock.gifend






包含这个Module,你就可以这样使用:

peoples=SafeJSON.parse('{"peoples":[{"name":"site120","email":"site120@163.com","sex":"男"},{"name":"site120_2","email":"site120@163.com_2","sex":"男_2"}]}')

puts peoples[
"peoples"][1]["name"]  #输出site120_2

rails通过RJS内置了对AJAX的支持,也许用到json的机会并不多,不过作为一种数据交换的方便格式,还是值的注意。

文章转自庄周梦蝶  ,原文发布时间5.17

最后更新:2017-05-17 10:02:09

  上一篇:go  地平线谭洪贺:AI芯片怎么降功耗?从ISSCC2017说起
  下一篇:go  前沿 | 国际可视化盛会PacificVis2017的十个精彩案例