Hamster.vector转换为json会遇到麻烦

时间:2014-03-18 16:41:31

标签: ruby-on-rails ruby json

我在项目中使用Hamster gem,在序列化为json时遇到问题。 以下是我的意思:

 hamster = Hamster.vector()
 => [] #is empty
 hamster.to_json
 => "{\"levels\":0,\"root\":[],\"size\":0}" # what is this?

所以,我的问题是:

有人可以解释为什么Hamster向对象添加levelsrootsize键,以及如何从json中删除它们。

3 个答案:

答案 0 :(得分:1)

hamster = Hamster.vector()
 => [] #is empty

Hamster.vector()返回EmptyVector类的单例实例(Hamster::Vector)。

[]显示为输出,因为 Enumerable#reduce 被Hamster覆盖。

levelsrootsize是类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'。