欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用ruby解析json

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



例子:
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC json = '["a", "B", "C"]'
 
puts "Unsafe #{unsafe_json(json).inspect}"   #输出Unsafe ["a", "B", "C"]






把上面的json字符串解析成Array。这样的方法并不安全,比如:
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC json = 'puts "Danger Will Robinson"'
  puts "Unsafe #{unsafe_json(json).inspect}" 
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC 







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


安全的方法如下:
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC module SafeJSON
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   require 
'monitor'
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   def SafeJSON.build_safe_json
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     ret 
= nil
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     waiter 
= ''
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     waiter.extend(MonitorMixin)
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     wait_cond 
= waiter.new_cond
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     Thread.start 
do
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC       $SAFE 
= 4
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC 使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC       ret 
= Proc.new 使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC {|json|
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC 使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC         eval(json.gsub(
/(["'])/s*:/s*(['"0-9tfn/[使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC {])/)使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC {"#{$1}=>#{$2}"})
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC       }

使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC       waiter.synchronize 
do
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC         wait_cond.signal
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC       end
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     end
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     waiter.synchronize 
do
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC 使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC       wait_cond.wait_while 
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC { ret.nil? }
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     end
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     
return ret
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   end
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   @@parser 
= SafeJSON.build_safe_json
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   # Safely parse the JSON input
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   def SafeJSON.parse(input)
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     @@parser.call(input)
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   rescue SecurityError
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC     
return nil
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC   end
使用ruby解析json
            
    
    博客分类: ruby & rails jsonRubyRailsAjaxC end






包含这个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的机会并不多,不过作为一种数据交换的方便格式,还是值的注意。