开发者社区> boxti> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

使用ruby解析json

简介:
+关注继续查看
rails1.1已经加入对json的全面支持,现在的Array,Hash,String,Object...等等都有一个to_json方法,生成 json字符串。反过来,我们该如何解析json呢?查了下http://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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【Ruby on Rails全栈课程】4.3 评论功能实现(二)--创建帖子详情页面
1、完善样式,用来显示帖子详情以及评论信息等,编辑app/assets/stylesheets/posts.scss文件,在原有代码下面添加代码:
27 0
【Ruby on Rails全栈课程】4.2 评论功能实现(一)--数据表的创建
1、详情页面功能描述 (1)点击帖子标题/帖子内容,进入帖子详情页面,评论框在详情页面最下面。 (2)点击详情页面的评论按钮,页面定位到评论框。(通过锚点定位) (3)点击每个评论下面的回复按钮,在该评论下面出现回复评论框,回复变成取消回复,点击取消回复,收起评论框。用js控制。 (4)如果评论被删除,评论内容展示为「该评论已删除」,该评论回复按钮隐藏,该评论下面的回复可以正常显示和回复 (5)每个评论回复的条数最多显示两条,多于两条,回复下面会显示「点击查看更多回复」
45 0
【Ruby on Rails全栈课程】4.1 点赞功能
1、功能描述: (1)一个用户对同一帖子只能点赞一次,点击第二次是取消赞 (2)用户不刷新页面的时候,点赞时当前页面相应贴子的点赞数+1,图标变成fa-thumbs-up,取消赞时当前页面相应帖子的点赞数-1,图标变成fa-thumbs-o-up,不受其他用户同时点赞操作的影响,这需要js来控制。 C、用户必须登录才能给帖子点赞。没有登录的话,点赞需要提醒登录。(在3.10章第3节已经实现了 if @current_user)
30 0
【Ruby on Rails全栈课程】3.10 网站主页面显示帖子列表
1、完善样式,编辑app/assets/stylesheets/home.css.scss文件,在原先代码后面添加下面代码
29 0
【Ruby on Rails问题】publish_name.rb文件中定义的变量显示没有定义NameError: uninitialized constant DB_CLASS
在rails项目中,config/initializers/publish_name.rb文件常用来定义的全局变量、全局常量。但是我们虽然在publish_name.rb文件中定义了常量,但是还是显示没有定义。来看一下解决方法。 问题描述: 在publish_name.rb文件中定义了变量DB_CLASS
25 0
【Ruby on Rails全栈课程】3.9 发布(创建)帖子
1、创建数据库表格 (1)创建posts表来保存贴子信息,表结构如下:
33 0
【Ruby on Rails全栈课程】3.8 权限管理之超级管理员审批功能实现
Rails提供一个叫做cancan的权限管理的插件,可以用来做权限控制,不过我们项目的权限管理不通过这个gem插件实现,通过控制用户角色字段来控制权限,这样灵活性比较大。
95 0
【Ruby on Rails全栈课程】3.7 邮件发送(SendCloud、MailGun)
1、邮件发送介绍 首先需要发送平台作为中介来为我们发送邮件,我们介绍两个邮件发送平台,其中SendCloud我们用来做我们实际的项目。MailGun平台适合付费用户,我们了解一下即可。 SendCloud(https://sendcloud.sohu.com/) SendCloud平台发送设置比较简单,不需要有自己的域名,可以不进行DNS配置,每天可以免费发送邮件10到50封 MailGun(https://www.mailgun.com/) MailGun平台设置比较复杂,必须有自己的域名,需要进行DNS配置,每天可以免费发送1500封邮件
68 0
【Ruby on Rails全栈课程】3.6 登录功能--session、cookie
1、功能描述 (1)登录需要填写信息:邮箱、密码。当邮箱没有注册需要进行相应的提示。 (2)将数据库保存的密码解密后,与用户在页面输入的密码作对比,相同可登录。 (3)用户角色为管理员时,需要判断这个账号的状态,状态为未激活时(status为1),需要flash.notice提醒激活。 2、编辑controller、view、路由 (1)在路由文件config/routes.rb中添加路由,通过此链接来提交在登录页面提交的信息
35 0
+关注
boxti
12535
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载