JSON là gì — file 'mặt mũi' của mọi API + cấu hình hiện đại

JSON (JavaScript Object Notation) là format dữ liệu phổ biến nhất 2026 — dùng cho mọi API, file cấu hình (package.json, tsconfig), và lưu data. Đọc/viết được JSON = đọc được response API, debug được config, hiểu được code dev gửi. Tiếng Anh dễ học nhất của ngành tech.

9 phút đọcCập nhật 2026-05-22
Nghe bài viết
Để Claude đọc bài cho bạn — vừa nghe vừa làm việc khác
Mục lục bài viết(27)
Example JSON code — minh hoạ cấu trúc JSON với key-value pair, array, nested object

Ví dụ JSON code với các thành phần cơ bản: key-value pair ("name": "value"), array [item1, item2], nested object { "addr": { "city": "HN" } }. Indent 2 hoặc 4 space là convention phổ biến. JSON là format trao đổi data phổ biến nhất 2026 — mọi REST API, mọi config file modern, mọi NoSQL DB đều dùng JSON. Nguồn: Wikimedia Commons (CC BY-SA 4.0).

Hiểu đơn giản nhất

JSON là cách viết data mà cả người + máy đọc được.

Tưởng tượng bạn có danh thiếp của một người:

Nguyễn Văn A
Founder vietcodex.com
Điện thoại: 0987654321
Email: [email protected]
Địa chỉ:
  Quận 1, HCM
  Việt Nam
Kỹ năng: React, Next.js, Postgres

Chuyển sang JSON — chỉ thay cách viết, không thay nội dung:

{
  "name": "Nguyễn Văn A",
  "title": "Founder vietcodex.com",
  "phone": "0987654321",
  "email": "[email protected]",
  "address": {
    "district": "Quận 1",
    "city": "HCM",
    "country": "Việt Nam"
  },
  "skills": ["React", "Next.js", "Postgres"]
}

JSON viết tắt từ JavaScript Object Notation — được phát minh năm 2001 bởi Douglas Crockford. Hiện là format trao đổi data phổ biến nhất internet.

6 kiểu data trong JSON

TypeVí dụ
String"Nguyễn Văn A" (luôn double quote)
Number42, 3.14, -99
Booleantrue, false
Nullnull (không có value)
Array["a", "b", "c"] (list)
Object{ "key": "value" } (dictionary)

Mọi cấu trúc phức tạp đều ghép từ 6 kiểu này.

Tại sao bạn cần biết

  • Đọc được response từ mọi API. Stripe, Zalo, OpenAI, Casso — tất cả trả JSON. Hiểu structure = debug được.
  • Đọc được file config dev gửi. package.json (Node), tsconfig.json, next.config.json, manifest.json — đều JSON.
  • Hiểu data API document. Stripe docs có ví dụ JSON cho mọi endpoint. Bạn cần know shape data đáp ứng yêu cầu integration.
  • Build no-code workflow chính xác. Zapier, Make, n8n đều pass JSON giữa các step. Map field sai = workflow vỡ.
  • Debug webhook payload. Casso/VNPay webhook gửi JSON body. Bạn cần đọc được để biết "tx id nào, amount bao nhiêu".
  • JSON-LD = SEO Rich Snippet. Schema FAQPage, Article, Product trong JSON-LD = Google hiểu nội dung trang sâu hơn.

Cú pháp JSON — 5 quy tắc

Quy tắc 1: Key PHẢI double quote

✅ { "name": "Vietcodex" }
❌ { name: "Vietcodex" }          ← thiếu quote
❌ { 'name': "Vietcodex" }        ← single quote không chấp nhận

JavaScript Object cho phép { name: ... } (no quote), JSON KHÔNG.

Quy tắc 2: String PHẢI double quote

"Việt Nam"
❌ 'Việt Nam'                     ← single quote sai

Quy tắc 3: Comma ngăn cách, KHÔNG có trailing comma

✅ { "a": 1, "b": 2 }
❌ { "a": 1, "b": 2, }            ← trailing comma cuối

Excel-savvy thường gõ trailing comma — JSON sẽ syntax error. JSON5 cho phép, JSON spec KHÔNG.

Quy tắc 4: Không comment

❌ {
     // Đây là comment - SAI
     "name": "value"
   }
 
✅ {
     "_comment": "Đây là workaround dùng key tên _comment",
     "name": "value"
   }

Quy tắc 5: Nested vô tận

{
  "company": {
    "name": "Vietcodex",
    "founders": [
      {
        "name": "A",
        "skills": ["React", "Next.js"],
        "address": {
          "city": "HCM",
          "geo": { "lat": 10.77, "lng": 106.7 }
        }
      },
      { "name": "B", "skills": [] }
    ]
  }
}

Bạn có thể nest unlimited, nhưng > 5 tầng = khó đọc + maintain. Flatten cấu trúc khi có thể.

JSON trong API — ví dụ thực

REST API GET response

GET https://api.shopee.vn/products/123

{
  "id": 123,
  "name": "Áo thun nam basic",
  "price": 199000,
  "currency": "VND",
  "in_stock": true,
  "stock_count": 42,
  "category": {
    "id": 5,
    "slug": "ao-thun-nam",
    "name": "Áo thun nam"
  },
  "images": [
    "https://cf.shopee.vn/products/123/main.jpg",
    "https://cf.shopee.vn/products/123/back.jpg"
  ],
  "ratings": {
    "average": 4.5,
    "count": 89,
    "distribution": {
      "5": 50,
      "4": 25,
      "3": 8,
      "2": 4,
      "1": 2
    }
  },
  "created_at": "2025-01-15T10:30:00Z"
}

REST API POST body

POST https://api.casso.vn/transactions

{
  "id": 123456,
  "tid": "FT2026000123456",
  "description": "VC2026000001",
  "amount": 800000,
  "when": "2026-05-22T10:30:00Z",
  "bank_sub_acc_id": "vcb-9999",
  "sub_acc_id": "9999",
  "virtual_account": "",
  "virtual_account_name": "",
  "corresponsive_name": "NGUYEN VAN A",
  "corresponsive_account": "1023456789",
  "corresponsive_bank_id": "970436",
  "corresponsive_bank_name": "Vietcombank"
}

Error response

{
  "success": false,
  "error": {
    "code": "INVALID_INPUT",
    "message": "Email is required",
    "details": {
      "field": "email",
      "received": null
    }
  }
}

JSON trong config file

package.json (Node.js project)

{
  "name": "vietcodex-app",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "node scripts/build-wiki-index.mjs && next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "next": "16.2.6",
    "react": "^19.0.0",
    "better-auth": "^1.6.10",
    "drizzle-orm": "^0.45.2"
  },
  "devDependencies": {
    "typescript": "^5.3.0",
    "@types/node": "^20.0.0"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "paths": {
      "@/*": ["./*"]
    }
  },
  "include": ["**/*.ts", "**/*.tsx"],
  "exclude": ["node_modules"]
}

.vscode/settings.json

{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "files.exclude": {
    "**/.next": true,
    "**/node_modules": true
  }
}

JSON-LD — JSON cho SEO

JSON-LD nhúng trong HTML để Google hiểu nội dung:

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@type": "Article",
      "headline": "Cookies, Session, Token — 3 cách web nhớ bạn",
      "datePublished": "2026-05-22",
      "author": {
        "@type": "Organization",
        "name": "VietCodex"
      }
    },
    {
      "@type": "BreadcrumbList",
      "itemListElement": [
        { "@type": "ListItem", "position": 1, "name": "Wiki", "item": "https://wiki.vietcodex.com" },
        { "@type": "ListItem", "position": 2, "name": "Cơ bản", "item": "https://wiki.vietcodex.com/co-ban" }
      ]
    },
    {
      "@type": "FAQPage",
      "mainEntity": [
        {
          "@type": "Question",
          "name": "Cookies có nguy hiểm không?",
          "acceptedAnswer": { "@type": "Answer", "text": "..." }
        }
      ]
    }
  ]
}
</script>

Google parse JSON-LD → hiện Rich Snippet:

  • FAQ accordion trong SERP
  • Breadcrumb thay vì URL
  • Article date + author

Tăng CTR 20-30%.

Parse + Stringify trong JavaScript

Parse — JSON string → JS Object

const jsonStr = '{"name":"A","age":25}';
const obj = JSON.parse(jsonStr);
 
console.log(obj.name);  // "A"
console.log(obj.age);   // 25

Stringify — JS Object → JSON string

const obj = { name: "A", age: 25, skills: ["React"] };
const jsonStr = JSON.stringify(obj);
// '{"name":"A","age":25,"skills":["React"]}'
 
// Pretty print với indent 2 space:
const pretty = JSON.stringify(obj, null, 2);
// {
//   "name": "A",
//   "age": 25,
//   "skills": ["React"]
// }

Common pitfalls

// 1. Date không trong JSON spec
const obj = { date: new Date() };
const str = JSON.stringify(obj);
// '{"date":"2026-05-22T10:30:00.000Z"}'
const back = JSON.parse(str);
back.date instanceof Date;  // false! Là string thường
 
// Cần re-parse manual:
back.date = new Date(back.date);
 
// 2. undefined biến mất
JSON.stringify({ a: undefined, b: null });
// '{"b":null}'  ← a không tồn tại
 
// 3. Function biến mất
JSON.stringify({ fn: () => 1 });
// '{}'
 
// 4. Circular reference throw
const a = { name: "A" };
a.self = a;
JSON.stringify(a);  // TypeError: Converting circular structure

Tools làm việc với JSON

ToolUse case
jq (CLI)Parse + transform JSON từ shell: `curl ...
JSONLint (web)Validate JSON syntax, hint lỗi
JSON Editor OnlineEdit JSON với tree view
Postman / Insomnia / BrunoTest API + view JSON response đẹp
DevTools Network tabXem JSON response của mọi request
VSCode JSON Tools extensionFormat, validate, fold trong editor
Zod / Yup / Joi (npm)Validate JSON schema trong code TS

Ví dụ thực tế: wiki.vietcodex.com search index

File public/wiki-search-index.json được generate mỗi build:

[
  {
    "slug": "co-ban/cookies-session-token",
    "title": "Cookies, Session, Token — 3 cách web nhớ bạn",
    "description": "HTTP vốn không có trí nhớ...",
    "category": "co-ban",
    "categoryLabel": "Cơ bản",
    "tags": ["cookies", "session", "token", "jwt"],
    "headings": ["Hiểu đơn giản nhất", "Tại sao bạn cần biết", ...],
    "body": "Hiểu đơn giản nhất Web hoạt động trên HTTP..."
  },
  {
    "slug": "co-ban/https-ssl-tls",
    "title": "HTTPS, SSL, TLS...",
    ...
  }
]

Frontend fetch file 213KB này, dùng Fuse.js search local — không cần backend.

Cái gì có thể sai

Vấn đềTriệu chứngCách fix
"Unexpected token" khi parseTrailing comma hoặc single quoteValidate qua JSONLint.com trước
Date sau parse thành stringJSON không có Date typeReviver function trong JSON.parse(s, reviver)
API response không match TS typeSchema không validateDùng Zod để parse + validate
Prototype pollution attackInput có __proto__Validate keys trước khi merge, dùng Object.create(null)
File JSON 100MB ăn hết RAMLoad toàn fileStream parse với stream-json hoặc convert JSONL
BigInt overflow (Twitter ID)Number JS chỉ 2^53Dùng string thay vì number cho ID lớn
Unicode escape saié vs éUTF-8 encoding đầy đủ, đừng escape ASCII-only

Tóm tắt 1 dòng

JSON = format trao đổi data phổ biến nhất 2026 (API, config, NoSQL DB, log, schema SEO). 6 kiểu: string/number/boolean/null/array/object. Key + string PHẢI double quote, không trailing comma, không comment. JSON.parse() + JSON.stringify() built-in mọi browser. JSON-LD trong HTML = Google hiểu nội dung → Rich Snippet SERP. Đọc JSON = đọc được response mọi API + debug config dev gửi.

Đọc tiếp

Câu hỏi thường gặp

JSON và JavaScript Object có giống nhau không?
Gần giống nhưng KHÔNG đồng nhất. JSON là format text trao đổi data (file string), JavaScript Object là cấu trúc trong memory khi code chạy. Khác biệt: (1) JSON key BẮT BUỘC quote `"name"`, JS Object có thể không; (2) JSON không có comment, không function, không undefined; (3) JSON value chỉ string/number/boolean/null/array/object — không có Date, không có Map/Set. Chuyển đổi: `JSON.parse(jsonString)` → JS Object, `JSON.stringify(jsObject)` → JSON string. Mọi browser + Node.js có sẵn.
JSON, XML, YAML, TOML — chọn cái nào?
JSON: ngắn gọn, browser native, mọi ngôn ngữ support, lý tưởng cho API. XML: dài dòng nhưng có schema validation mạnh (XSD), dùng trong SOAP API cũ (banking, government). YAML: human-friendly nhất (indent thay vì bracket), dùng cho config (docker-compose.yml, GitHub Actions). TOML: thay YAML cho project Rust/Python (pyproject.toml, Cargo.toml). Quy tắc 2026: API trao đổi → JSON. Config file → YAML hoặc TOML. Legacy/government → XML. Browser data → JSON only.
JSON có thể có comment không?
Không — JSON spec chính thức KHÔNG cho phép comment. Đây là decision controversial vì người viết hay muốn comment trong config. Workaround: (1) Dùng field `"_comment"` (key bắt đầu underscore, app code ignore); (2) Dùng JSONC (JSON with Comments) — Microsoft extension cho `.json` trong VSCode, package.json không hỗ trợ; (3) Dùng JSON5 — superset cho phép comment + trailing comma; (4) Migrate sang YAML/TOML nếu cần comment. Spec author Douglas Crockford đã từng giải thích: 'Comment làm encoder/decoder phức tạp, breaks streaming.'
JSON Schema là gì? Có cần học không?
JSON Schema = ngôn ngữ describe + validate cấu trúc JSON. Vd: 'object phải có field name string, age number 0-150, email regex'. Ưu: (1) Validate input API; (2) Auto-generate docs (Swagger/OpenAPI); (3) Type-safe code via codegen. Dùng khi: build public API, integrate với Zod/Yup/Joi validation library. Founder không cần học JSON Schema raw — dùng TypeScript + Zod là tương đương + thân thiện hơn. Code: `z.object({ name: z.string(), age: z.number().min(0).max(150) })` — vietcodex.com dùng Zod trong mọi API route.
JSON.parse có thể bị attack không?
Có 2 risk: (1) **Prototype pollution** — input JSON có key `__proto__` hoặc `constructor.prototype` ăn sâu chain prototype. Tránh bằng cách dùng `JSON.parse(input, reviver)` reject reserved keys, hoặc dùng `Object.create(null)` cho lookup. (2) **DOS via large JSON** — input 10MB nested deep gây stack overflow hoặc OOM. Set max body size 1-5MB cho API. (3) Khi receive JSON từ user input KHÔNG `eval()` — luôn `JSON.parse()`. Library helper: `secure-json-parse` (npm) reject prototype keys built-in.
JSON Lines (JSONL) là gì? Khác JSON thường thế nào?
JSONL = 1 dòng = 1 JSON object, không có comma giữa, không wrap trong array. Dùng cho streaming + log + dataset lớn. Vd file `logs.jsonl`:\n```\n{"time":"...","level":"info","msg":"start"}\n{"time":"...","level":"error","msg":"fail"}\n```\nƯu: stream được — đọc từng dòng không load toàn file; append nhanh; partial corruption không phá hết. Dùng cho: Stripe webhooks export, OpenAI fine-tuning dataset, log aggregator (Loki, ELK). Format đứng giữa CSV và JSON full.
JSON-LD là gì? Có liên quan SEO không?
JSON-LD (Linked Data) = JSON với schema metadata cho web. Google đọc JSON-LD trong `<script type="application/ld+json">` của HTML để hiểu nội dung trang (Article, Product, Recipe, Organization...) → hiện Rich Snippet trong search. Tăng CTR 20-30% so với plain blue link. vietcodex.com inject JSON-LD `@graph` cho mọi wiki article (Article + BreadcrumbList + FAQPage). Format chuẩn schema.org. Bài blog có FAQPage JSON-LD = có thể chiếm AI Overview citation.