如何将 Sequel 结果序列化为 JSON

How to serialize a Sequel result into JSON

这是我的模特

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 数据库,但我认为这不重要。

您需要使用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}"

json 库(Ruby 标准库的一部分)和其他 gem,例如 ActiveSupport,带有 to_json 方法的猴子补丁对象,这可能是被调用的方法,而不是 Sequel 提供的特定 to_json 方法,它知道如何将 Sequel::Model 实例转换为 JSON。这是猜测,因为我很惊讶 JSON 库猴子修补了 StringArrayHash 等以外的任何东西

当使用 DB[:clients].first 时,你可能会得到一个 Hash,它有一个 to_json 方法,而 Client.first returns 是一个模型实例,它不是t 由 json 库提供的通用 to_json 方法处理。

尝试注册 Sequel JSON 插件,这应该优先于 monkey patched to_json 方法:

Sequel::Model.plugin :json_serializer

顺便说一句,这很好地说明了为什么猴子修补通常不是一个好主意,尤其是在 libraries/gems 命名空间之外的 类 猴子修补。