我用rails创建了一个REST API,并使用.to_json将API输出转换为json响应。例如:@response.to_json
响应中的对象包含created_at和updated_at字段,都是日期时间
在JSON响应中,这两个字段都被转换为字符串,这比unixtimestamp的解析成本更高。
是否有一种简单的方法可以将created_at和updated_at字段转换为unixtimestamp,而无需遍历@response中的整个对象列表?
(更新)danielM的解决方案工作,如果它是一个简单的。to_json。但是,如果我有一个.to_json(:include=>:object2),则as_json将导致响应不包含object2。对此有什么建议吗?
在响应模型上定义as_json方法。每当您将响应模型的实例作为JSON返回到REST API时,该脚本就会运行。
def as_json(options={})
{
:id => self.id,
:created_at => self.created_at.to_time.to_i,
:updated_at => self.updated_at.to_time.to_i
}
end
你也可以显式调用as_json方法来获取哈希值,并在其他地方使用它。
hash = @response.as_json
Unix时间戳引用:Ruby/Rails:将Date转换为Unix时间戳
编辑:as_json方法也适用于关系。只需将键添加到函数返回的散列中。这也将运行关联模型的as_json方法。
def as_json(options={})
{
:id => self.id,
:created_at => self.created_at.to_time.to_i,
:updated_at => self.updated_at.to_time.to_i,
:object2 => self.object2,
:posts => self.posts
}
end
此外,您可以向方法传递参数来控制如何构建哈希。
def as_json(options={})
json = {
:id => self.id,
:created_at => self.created_at.to_time.to_i,
:updated_at => self.updated_at.to_time.to_i,
:object2 => self.object2
}
if options[:posts] == true
json[:posts] = self.posts
end
json
end
hash = @response.as_json({:posts => true})