API JSON
Возвращайте JSON
«API JSON» — бесплатный урок Ruby Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Ruby Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Ruby Academy содержит 4 уроков всего.
Зачем нужны API JSON
JSON — стандартный формат данных для веб-API. Клиенты отправляют и получают структурированные данные вместо 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]Возврат JSON из Sinatra
В маршруте 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-запроса
Для API с методом POST прочитайте необработанное тело запроса и разберите его.
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.
Повторение
Вы научились создавать API на основе JSON:
- Подключать
require 'json'из стандартной библиотеки - Сериализовать Ruby в JSON с помощью
to_json/JSON.generate - Десериализовать входящий JSON с помощью
JSON.parse - Задавать
content_type :jsonв маршрутах Sinatra - Всегда перехватывать
JSON::ParserError
Далее вы изучите Rack и промежуточное ПО.
Часто задаваемые вопросы
Урок «API JSON» бесплатный?
Да — полный текст урока «API JSON» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Ruby Academy, подпишись на CoddyKit PRO. Курс Ruby Academy содержит 4 уроков всего.
Чему я научусь в уроке «API JSON»?
Возвращайте JSON Ты практикуешь Ruby Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Ruby Academy?
Предыдущий опыт не требуется. Ruby Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «API JSON»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Ruby Academy?
Да. Каждый урок Ruby Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.