如何将续集结果序列化为JSON

时间:2017-05-16 19:30:38

标签: json ruby sequel

这是我的模特

class Client < Sequel::Model(:clients)
end

执行时

Client.first.to_json

我得到了

"\"#<Client:0x2594b824>\""

但是当我执行

DB[:clients].first.to_json

我正确地得到了:

{id: 1, name: "Someone" ... }

我做错了什么?...我也尝试使用具有相同结果的Client.dataset.first.json

我也使用MS Access DB,但我认为这不重要。

2 个答案:

答案 0 :(得分:2)

json库(Ruby标准库的一部分)和其他宝石(如ActiveSupport),带有to_json方法的猴子补丁对象可能是被调用的,而不是特定的{ Sequel提供的{1}}方法知道如何将to_json实例转换为JSON。这是猜测,因为我对JSON库猴子补丁除了Sequel::ModelStringArray等以外的其他内容感到惊讶。

使用Hash时,您可能会返回DB[:clients].firstHash方法,其中to_json会返回一个模型实例,该实例不会被Client.first处理json库提供的通用to_json方法。

尝试注册Sequel JSON插件,这应该优先于猴子修补to_json方法:

Sequel::Model.plugin :json_serializer

顺便说一下,这是一个很好的指标,说明为什么猴子修补通常是一个坏主意,特别是对库/ gems名称空间之外的类进行猴子修补。

答案 1 :(得分:1)

您需要使用to_hash

require 'json'
require 'sequel'

DB = Sequel.sqlite
DB.create_table :items do
  primary_key :id
  String :name
  Float :price
end
items = DB[:items]
items.insert(:name => 'abc', :price => rand * 100)

class Item < Sequel::Model(:items)
end

Item.first
  .to_hash # => {:id=>1, :name=>"abc", :price=>51.47074347440235}
  .to_json # => "{\"id\":1,\"name\":\"abc\",\"price\":51.47074347440235}"