【问题标题】:How to serialize stored JSON serialization (in Ruby/Rails)?如何序列化存储的 JSON 序列化(在 Ruby/Rails 中)?
【发布时间】:2018-11-07 21:47:41
【问题描述】:

我想在我的表 (Postgres) 中存储一个 JSON blob。该表需要经常阅读。在我的应用程序读取表后,它会将此 blob 的 JSON 序列化以及此表的其他属性返回给客户端。

# To illustrate, imagine an object like this
{
  name: 'foo',
  blob: {...} # this is blob that needs to be stored
}

当客户请求它时,我想返回一个 JSON 响应,例如

{"name": "foo", "blob": [...]}

给定一个 Postgres 数据库,显而易见的选择是将 blob 存储在 json/jsonb 列中。但是文本列呢?假设应用程序不使用 blob,将序列化的字符串存储在文本列中意味着服务器不需要反序列化 blob,然后在客户端发送请求时序列化回 JSON。换句话说,服务器可以简单地将 blob 视为字符串。听起来更有效率,对吧?

但是,由于现在将 blob 视为字符串,所以我得到的序列化变成了

{"name": "foo", "blob": "[...]"} # note the extra " around the array brackets

这会导致客户端应用程序中的解析不正确,因为现在 blob 被解析为字符串而不是数组。

所以我的问题是

一个。我是否正确假设文本列将比 jsonb 更有效(假设此问题已解决)?

b.如果是这样,是否有办法返回已经序列化的 JSON 对象而不将其视为字符串?如果没有,避免这种反序列化然后立即序列化浪费的最佳方法是什么?

【问题讨论】:

标签: ruby-on-rails json ruby


【解决方案1】:

别担心。

当您在 Rails 中使用 JSON/JSONB 列时,驱动程序会处理 JSON 的序列化/反序列化。您所要做的就是将该列声明为 JSON/JSONB。

在 text/varchar 列中存储任何其他格式的 JSON/YAML 不太可能带来任何明显的性能提升,但不允许您正确查询该列。这就是我们在拥有原生 JSON/JSONB/HStore 列之前的黑暗时期所做的。

它还会在您的模型中增加编组/解组的负担 - 使模型膨胀并放弃使用更优化的驱动程序代码。

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 2010-10-11
    • 2016-12-15
    • 2016-12-04
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2023-03-13
    • 2011-06-10
    相关资源
    最近更新 更多