如何使用Ruby自动将JSON时间字符串转换为Time对象?

时间:2018-04-02 18:24:30

标签: ruby-on-rails json ruby time

当我使用Ruby来使用返回JSON中的时间字符串的Web服务API时,我希望它们自动转换为Time个对象(或DateTime个对象),这样我就没有了亲自动手。

例如,我希望此输出Time而不是String

irb(main):001:0> require 'json'
=> true
irb(main):002:0> payload = JSON.generate({ now: Time.now })
=> "{\"now\":\"2018-04-02 13:15:56 -0500\"}"
irb(main):003:0> JSON.parse(payload)['now'].class
=> String

据我所知,时间不是JSON规范的一部分。我只是想知道是否有办法配置Ruby的stdlib JSON解析器来自动解析日期,或者是否存在为您执行此操作的库。

1 个答案:

答案 0 :(得分:6)

当您设置ActiveSupport::TimeWithZone时,Active Support会自动将ISO 8601格式的时间转换为ActiveSupport.parse_json_times = true个对象。

http://api.rubyonrails.org/classes/ActiveSupport/JSON.html

#!/usr/bin/env ruby

require 'active_support/json'
require 'active_support/time'

Time.zone = 'UTC'
ActiveSupport.parse_json_times = true

puts payload1 = JSON.generate({ now: Time.now })
puts payload2 = ActiveSupport::JSON.encode({ now: Time.now })

puts ActiveSupport::JSON.decode(payload1)['now'].class
puts ActiveSupport::JSON.decode(payload2)['now'].class

将输出:

{"now":"2018-04-02 13:19:40 -0500"}
{"now":"2018-04-02T13:19:40.291-05:00"}
String
ActiveSupport::TimeWithZone

请注意,Active支持可以解析Ruby stdlib的默认时间。仅成功转换ISO 8601格式化时间。积极支持uses a regex to detect times。您可以read the tests了解它支持的时间格式。看起来它支持ISO 8601,但支持Unix / POSIX / Epoch时间戳。

创建this issue against Rails时,我在动态支持中获知此功能。

一些历史记录:时间解析曾经是Rails中的默认行为,但是为那些想要关闭它的人添加了ActiveSupport.parse_json_times,然后它默认关闭了,所以现在你必须选择进入它。