如何在Ruby中自动将JSON时间字符串转换为Time对象?
自动将JSON中的时间字符串转换为Ruby Time/DateTime对象
嘿,我懂你的需求——就是想让Ruby调用返回JSON格式的Web服务API时,自动把里面的时间字符串转成Time或者DateTime对象,不用每次手动处理,对吧?刚好有几个实用的方法可以解决这个问题:
方法一:用Ruby标准库自带的create_additions选项
Ruby的json标准库其实已经内置了时间自动转换的能力,只需要在调用JSON.parse时加上create_additions: true参数就行。它会自动识别符合格式的时间字符串,转成Time对象。
看这个示例:
require 'json' payload = JSON.generate({ now: Time.now }) # 解析时开启自动转换时间的选项 result = JSON.parse(payload, create_additions: true) puts result['now'].class # 输出:Time
不过要注意,这个选项默认是关闭的,开启后就能帮你省掉手动转换的步骤啦。
方法二:自定义解析器处理特殊时间格式
如果你的API返回的时间格式比较特殊,标准库的自动识别不生效,那可以自定义一个解析逻辑,灵活控制哪些字段或者格式需要转成时间对象。
比如我们可以写一个继承自Hash的类,在赋值的时候自动处理时间:
require 'json' # 需要用DateTime的话记得先引入date库:require 'date' class TimeAwareHash < Hash def []=(key, value) # 这里可以根据业务需求调整判断条件:比如指定字段名,或者匹配时间格式 time_format_regex = /\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}/ if key.to_s.downcase == 'now' || value.match?(time_format_regex) # 转成Time,要DateTime的话就换成DateTime.parse(value) super(key, Time.parse(value)) else super(key, value) end end end payload = JSON.generate({ now: Time.now, normal_text: "这是普通字符串" }) result = JSON.parse(payload, object_class: TimeAwareHash) puts result['now'].class # 输出:Time puts result['normal_text'].class # 输出:String
这种方式自由度更高,不管你的时间格式是什么样的,都能通过调整判断逻辑来适配。
内容的提问来源于stack exchange,提问作者Sean Moubry
相关产品推荐
相关产品推荐

