You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Ruby后端将嵌套对象以JSON格式传递至前端AJAX

刚接触Ruby就碰到这个序列化的问题很正常,我来给你捋捋怎么解决~

解决Ruby类实例嵌套结构的JSON序列化问题

核心原因

Ruby的to_json默认只能处理原生数据类型(哈希、数组、字符串等),对于自定义类的实例,它不知道该提取哪些属性、怎么转化成JSON结构,所以得我们手动给它指定规则才行。

方法一:给自定义类实现as_json方法

to_json内部其实是先调用对象的as_json方法,得到一个可被序列化的哈希,再把这个哈希转成JSON字符串。所以我们只需要给类写好as_json方法,就能让to_json正常工作:

比如我们有嵌套的用户类和地址类:

class Address
  attr_accessor :street, :city

  def initialize(street, city)
    @street = street
    @city = city
  end

  # 定义as_json,返回需要序列化的属性哈希
  def as_json(options = {})
    {
      street: street,
      city: city
    }
  end
end

class User
  attr_accessor :name, :address

  def initialize(name, address)
    @name = name
    @address = address
  end

  def as_json(options = {})
    {
      name: name,
      # 因为Address已经实现了as_json,这里直接调用即可处理嵌套
      address: address.as_json(options)
    }
  end
end

# 测试一下
address = Address.new("Main St", "New York")
user = User.new("Alice", address)
puts user.to_json
# 输出:{"name":"Alice","address":{"street":"Main St","city":"New York"}}

如果想要更灵活的控制(比如指定只序列化某些属性),还可以让as_json支持only/except参数:

def as_json(options = {})
  base_attrs = [:name, :address]
  # 根据参数筛选要序列化的属性
  if options[:only]
    attrs = base_attrs & options[:only]
  elsif options[:except]
    attrs = base_attrs - options[:except]
  else
    attrs = base_attrs
  end
  # 遍历属性生成哈希
  attrs.each_with_object({}) do |attr, hash|
    hash[attr] = send(attr).as_json(options)
  end
end

方法二:使用JSON.generate的default参数

如果不想修改类的代码,可以在调用JSON.generate时传入一个default块,告诉序列化器遇到自定义类实例该怎么处理:

address = Address.new("Main St", "New York")
user = User.new("Alice", address)

json_str = JSON.generate(user) do |obj|
  # 根据实例类型返回对应的序列化结构
  if obj.is_a?(Address)
    { street: obj.street, city: obj.city }
  elsif obj.is_a?(User)
    { name: obj.name, address: obj.address }
  else
    # 其他类型用默认逻辑处理
    obj.to_s
  end
end

puts json_str

方法三:借助序列化库(Rails项目适用)

如果你是在Rails环境开发,可以用active_model_serializers库,它能更优雅地定义序列化规则——给每个类写对应的序列化器,自动处理嵌套关系,适合复杂的项目结构。


内容的提问来源于stack exchange,提问作者Maiya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:47:19