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 序列化为 JSONJSON.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 反馈 — 无需本地设置。
此课程中的所有课时
- Sinatra 基础
- 路由与参数
- JSON API
- 中间件与 Rack