JSON Patterns in Next.js (App Router)
Next.js provides multiple JSON data fetching strategies depending on rendering requirements: Server Components (RSC), API Route Handlers, and Client Components.
API Route Handlers (App Router)
Create files in app/api/*/route.ts that export named HTTP method functions returning Response.json().
// app/api/users/route.ts — JSON API Route Handler
import { NextResponse } from 'next/server';
export async function GET() {
const users = await db.users.findMany();
return NextResponse.json(users);
}
export async function POST(request: Request) {
const body = await request.json(); // Parse JSON body
const created = await db.users.create({ data: body });
return NextResponse.json(created, { status: 201 });
}
// app/users/page.tsx — Server Component fetch
async function UsersPage() {
const res = await fetch('/api/users', { cache: 'no-store' });
const users = await res.json();
return <ul>{users.map((u: User) => <li key={u.id}>{u.name}</li>)}</ul>;
}
// Client Component with SWR
'use client';
import useSWR from 'swr';
const fetcher = (url: string) => fetch(url).then(r => r.json());
function ClientUsers() {
const { data, error } = useSWR('/api/users', fetcher);
if (error) return <p>Error loading users</p>;
if (!data) return <p>Loading...</p>;
return <ul>{data.map((u: User) => <li key={u.id}>{u.name}</li>)}</ul>;
}