【发布时间】:2018-06-26 13:21:46
【问题描述】:
我想更改DateTime 在Hash#to_json 中的序列化方式以获得更高的精度。
require 'date'
require 'json'
puts ({my_time: DateTime.now}.to_json) # => {"my_time":"2018-01-17T15:34:30+00:00"}
这个工作示例包括毫秒:
require 'date'
require 'json'
class A
class ::DateTime
def as_json(*)
iso8601(3)
end
def to_json(*args)
as_json.to_json(*args)
end
end
def serialize_hash
{my_time: DateTime.now}.to_json
end
end
这会覆盖DateTime#to_json 以产生预期的结果,但更改是全局的。我需要在 only 类A 中更改DateTime.to_json。
# Includes milliseconds, as expected
puts A.new.serialize_hash # => {"my_time":"2018-01-17T15:33:44.348+00:00"}
# Outside class A
# Should not include milliseconds
puts ({my_other_time: DateTime.now}.to_json) # => {"my_other_time":"2018-01-17T15:33:44.348+00:00"}
这种全局变化使我的一个 gem 无法加载 TypeError: superclass mismatch for class DateTime。
这是一个纯 Ruby 实现。没有导轨。
编辑:根据@SergioTulentsev 的建议,我现在正在改进。
require 'date'
require 'json'
module DateTimeExtensions
refine DateTime do
def as_json(*)
iso8601(3)
end
def to_json(*args)
as_json.to_json(*args)
end
end
end
看来Hash#to_json 看不到我的细化。
using DateTimeExtensions
# Has milliseconds, as expected
puts DateTime.now.to_json # => "2018-01-17T16:23:46.043+00:00"
# Should also have milliseconds, but does not
puts ({my_time: DateTime.now}.to_json) # => {"my_time":"2018-01-17T16:23:46+00:00"}
【问题讨论】:
-
这正是细化所做的。阅读此内容。
-
@SergioTulentsev 或者这正是对
iso8601的显式调用:{my_time: DateTime.now.iso8601(3)}.to_json:) -
阅读这篇文章,了解 Refinements 的工作原理jakeyesbeck.com/2015/12/13/ruby-refinements
标签: json ruby datetime serialization