我在项目中使用Hamster
gem,在序列化为json时遇到问题。
以下是我的意思:
hamster = Hamster.vector()
=> [] #is empty
hamster.to_json
=> "{\"levels\":0,\"root\":[],\"size\":0}" # what is this?
所以,我的问题是:
有人可以解释为什么Hamster
向对象添加levels
,root
和size
键,以及如何从json中删除它们。
答案 0 :(得分:1)
hamster = Hamster.vector()
=> [] #is empty
Hamster.vector()
返回EmptyVector
类的单例实例(Hamster::Vector
)。
[]
显示为输出,因为 Enumerable#reduce 被Hamster覆盖。
levels
,root
和size
是类Hamster::Vector
的实例变量,它们是在 Hamster::Vector#initialize 方法中初始化的。
所以当你hamster.to_json
时,你会看到输出为
=> "{\"levels\":0,\"root\":[],\"size\":0}"
使用Hamster::Vector#empty?
方法检查hamster
对象是否为空?即@size == 0
hamster.to_json unless hamster.empty?
这样,如果仓鼠是一个空对象,你不会将它转换为json。
答案 1 :(得分:1)
更好的解决方案是hamster.to_a.to_json
。
答案 2 :(得分:1)
当前版本的Hamster有一个方便的.to_ruby功能。
Hamster::Vector[].to_json # => "\"#<Hamster::Vector:0x0000000238b678>\""
Hamster.to_ruby(Hamster::Vector[]) # => []
Hamster.to_ruby(Hamster::Vector[]).to_json # => "[]"
您可以阅读有关Hamster.to_ruby here的更多信息。
好处是它适用于Hamster定义的每种类型。 如果传递的参数是'nil',它也只返回'nil'。