You need to enable JavaScript to run this app. Ruby:如何基于含嵌套键值对的JSON数据创建类实例对象
优惠活动
大模型
产品
解决方案
定价
更多

Ruby:如何基于含嵌套键值对的JSON数据创建类实例对象

针对当前需求的实现步骤

先修正类定义里的两个新手常见问题

  • 拼写错误:你写的构造方法名initialise是英式拼写,Ruby固定的实例初始化方法名是initialize,拼错的话方法不会被自动调用,等于白写。
  • 键值映射不匹配:你定义的attr_accessor里有:name属性,但JSON数据里对应的顶级字段是restaurant,两者没有对应关系,直接取值会得到空值,需要手动做映射。

initialize方法的核心逻辑

初始化方法里只需要做3件事:

  1. 把传入的单条JSON哈希里的restaurant字段值,赋值给实例的@name变量
  2. 把嵌套结构的cost哈希整体赋值给实例的@cost变量,不需要额外拆分层级,Ruby原生哈希就支持键值对的快速访问
  3. 示例JSON里没有和:type对应的字段,先留空赋值为nil即可,后续有对应数据再补充赋值逻辑就行

完整可运行的代码示例

修正后的Restaurant类

class Restaurant
  # 声明对外可访问、可修改的实例属性
  attr_accessor :name, :type, :cost

  def initialize(json_data)
    # 映射顶级字段到对应实例属性
    @name = json_data["restaurant"]
    # 直接存放嵌套的cost哈希,后续可通过["字段名"]访问嵌套数值
    @cost = json_data["cost"]
    # 暂无对应数据源的属性先初始化空值
    @type = nil
  end
end

批量生成实例的逻辑

你已经把JSON内容处理成哈希数组后,不需要手动逐行赋值,直接用map方法循环把每一项数据传给类的构造方法即可:

# 你已经解析好的原始JSON数据数组
raw_json_data = [
  { "restaurant": "hells kitchen", "cost": { "dine in": 100.00 } },
  { "restaurant": "sals pizza", "cost": { "dine in": 25.50, "takeaway": 20.00, "delivery": 28.50 } },
  { "restaurant": "five guys burgers", "cost": { "dine in": 18.50, "takeaway": 16.50, "delivery": 20.00 } }
]

# 批量生成所有餐厅的实例对象
restaurant_list = raw_json_data.map { |single_data| Restaurant.new(single_data) }

实际访问验证

生成实例后可以直接通过公开属性访问对应值:

# 访问第一家店的名称
restaurant_list[0].name
# 返回值:"hells kitchen"

# 访问第二家店的堂食价格(嵌套在cost结构里)
restaurant_list[1].cost["dine in"]
# 返回值:25.5

新手常见注意事项

  • 取值时注意键的类型匹配:如果是标准JSON.parse解析出来的数据,键默认是字符串类型;如果是手动写的哈希,键可能是符号类型,取值时用的键要和实际存储的类型一致,不然会取到nil。
  • 嵌套的cost结构不需要强制拆分成独立的类属性,直接存哈希的写法对新手最友好,等熟悉基础逻辑后,再考虑把嵌套结构也封装成独立类来简化访问写法就可以。
  • 不要把整个JSON数组传入单个Restaurant实例的初始化方法,每个实例对应单条餐厅数据,多组数据存放在数组里批量管理即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 09:24:04