我使用rails创建了一个REST API,并使用.to_json将API输出转换为json响应。例如。 @ response.to_json
响应中的对象包含created_at和updated_at字段,均为Datetime
在JSON响应中,这两个字段都转换为字符串,解析比unixtimestamp更昂贵。
有没有一种简单的方法可以将created_at和updated_at字段转换为unixtimestamp而无需遍历@response中的整个对象列表?
[更新] danielM的解决方案是有效的,如果它是一个简单的.to_json。但是,如果我有.to_json(:include =>:object2),as_json将导致响应不包括object2。对此有何建议?
答案 0 :(得分:4)
在响应模型上定义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: converting a Date to a UNIX timestamp
编辑: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})