0Pricing
Ruby Academy · 课时

JSON API

返回 JSON

JSON API 是 CoddyKit 上的免费 Ruby Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Ruby Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Ruby Academy 课程共包含 4 节课。

为什么使用 JSON 应用程序接口

JSON 是网络应用程序接口的标准数据格式。客户端发送和接收结构化数据,而不是 HTML。

  • 与语言无关
  • 可以自然地映射到 Ruby 哈希和数组
  • 轻量且易于阅读

Ruby 的标准库通过 json 模块处理 JSON。

require 'json'

data = { name: 'Ada', langs: ['Ruby', 'Python'] }
puts data.to_json

将 Ruby 转换为 JSON

请在哈希或数组上调用 to_json,或者使用 JSON.generate。

  • 符号和字符串会成为 JSON 键
  • 嵌套结构会递归转换
require 'json'

user = { id: 1, active: true, tags: ['admin'] }
puts JSON.generate(user)

美化打印 JSON

如需获得易读的输出,请使用 JSON.pretty_generate。

  • 添加缩进和换行
  • 非常适合调试和日志
  • 生产环境的响应应避免使用,以节省字节数
require 'json'

config = { server: { host: 'localhost', port: 4567 } }
puts JSON.pretty_generate(config)

解析 JSON 输入

使用 JSON.parse 将传入的 JSON 字符串转换为 Ruby 对象。

  • 默认情况下,键是字符串
  • 传入 symbolize_names: true 可使用符号键
require 'json'

raw = '{"name": "Ada", "age": 30}'
data = JSON.parse(raw)
puts data['name']
puts data['age']

符号化的键

符号键使用方便,查找速度也略快。

  • 使用 symbolize_names: true 启用
  • 请注意,不受信任的输入可能会创建大量符号
require 'json'

raw = '{"city": "Istanbul"}'
data = JSON.parse(raw, symbolize_names: true)
puts data[:city]

从 Sinatra 返回 JSON

在 Sinatra 路由中设置内容类型,并返回 JSON 字符串。

  • content_type :json 设置标头
  • 将 hash.to_json 作为正文返回
require 'sinatra'
require 'json'

get '/api/status' do
  content_type :json
  { status: 'ok', time: Time.now.to_i }.to_json
end

读取 JSON 请求正文

对于 POST API,请读取原始正文并解析。

  • request.body.read 提供原始字符串
  • 使用 JSON.parse 解析
require 'sinatra'
require 'json'

post '/api/users' do
  payload = JSON.parse(request.body.read)
  content_type :json
  { created: payload['name'] }.to_json
end

构建 API 响应哈希

在序列化之前构建结构化哈希,以保持响应一致。

  • 将数据封装在 data 键下
  • 包含状态和元数据
require 'json'

def api_response(data, status: 'ok')
  { status: status, data: data }.to_json
end

puts api_response({ id: 1, name: 'Ada' })

处理解析错误

格式错误的 JSON 会引发 JSON::ParserError。请始终捕获它。

  • 向客户端返回 400(错误请求)响应
  • 绝不要让解析错误导致应用崩溃
require 'json'

begin
  JSON.parse('{ broken')
rescue JSON::ParserError => e
  puts "Invalid JSON: #{e.message}"
end

序列化对象数组

集合会自然地序列化为 JSON 数组。

  • 哈希数组会变成对象数组
  • 使用 map 调整每条记录的形状
require 'json'

users = [{ id: 1, name: 'Ada' }, { id: 2, name: 'Bob' }]
output = users.map { |u| { name: u[:name] } }
puts output.to_json

为对象自定义 to_json

您可以通过定义 to_json 或 as_json,让类了解如何进行序列化。

  • 将内部状态转换为普通哈希
  • 对 API 隐藏私有字段
require 'json'

class User
  def initialize(id, name)
    @id = id
    @name = name
  end

  def to_json(*)
    { id: @id, name: @name }.to_json
  end
end

puts User.new(1, 'Ada').to_json

快速检查

确认您对 JSON API 的了解。

回顾

您学会了构建JSON API:

  • 从标准库中 require 'json'
  • to_json / JSON.generate 将 Ruby 序列化为 JSON
  • JSON.parse 将传入的 JSON 反序列化
  • 在 Sinatra 路由中设置 content_type :json
  • 始终捕获 JSON::ParserError

接下来您将探索 Rack 和中间件。

常见问题解答

「JSON API」课时是免费的吗?

是的 — 「JSON API」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Ruby Academy 课程的其余内容,请升级到 CoddyKit PRO。 Ruby Academy 课程共包含 4 节课。

「JSON API」这节课中我会学到什么?

返回 JSON 你通过在浏览器中直接运行的动手代码来练习 Ruby Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Ruby Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Ruby Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「JSON API」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Ruby Academy 课中编写并运行代码吗?

能。每节 Ruby Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Sinatra 基础
  2. 路由与参数
  3. JSON API
  4. 中间件与 Rack
← 返回 Ruby Academy