본문 바로가기
C.W.K.
Stream
Lesson 02 of 08 · published

여섯 타입 — 그리고 빠진 것들

~10 min · json, types, spec

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

여섯 값, 예외 없음

JSON 의 값 타입은 여섯 개야. string, number, boolean, null, object, array. 어휘가 이게 전부야. 아무리 깊이 중첩된 JSON 문서라도 결국 이 여섯 개를 쌓아 만든 거야.

JSON 에 없는 것

  • undefined 가 없어 — JavaScript 엔 있지만 JSON 엔 없어. 값이 비었으면 null 을 쓰거나 키를 아예 빼.
  • 함수가 없어 — JSON 은 데이터지 코드가 아니야.
  • 주석이 없어 — Crockford 가 일부러 뺐어. 설명은 문서 파일에 따로 적거나 JSON5, JSONC 같은 확장을 써.
  • 날짜 타입이 없어 — 날짜는 그냥 문자열이야. 관행상 ISO 8601 로 적어 (2026-05-04T01:30:11Z).
  • BigInt 가 없어 — 숫자는 전부 IEEE 754 float 이야. 253 를 넘어가면 정수 정밀도가 소리 없이 날아가.
  • regex, Map, Set 이 없어 — JS 전용 타입은 평범한 object 나 array 로 풀어서 내보내야 해.

함의: JSON 은 어떤 언어의 완벽한 거울도 아니다

어느 언어든 자기 타입을 JSON 의 여섯 개에 끼워 맞춰야 해. Python tuple 은 array 가 되고, JavaScript undefinednull 이 되거나 아예 사라지고, 날짜는 ISO 문자열이 돼. 그래서 왕복시키려면 JSON.stringify 하나로는 부족하고 서로 약속한 관행이 필요해.

'JSON 은 날짜가 있다' 거짓말: ECMAScript 의 JSON.stringify 는 Date 를 ISO 문자열로 바꿔줘. 그런데 그 문자열을 JSON.parse 하면 돌아오는 건 Date 가 아니라 string 이야. 왕복이 안 맞는 거지. 진짜 날짜가 필요하면 reviver 함수를 쓰거나 schema 로 검증해.

Code

한 문서에 6 타입 모두·json
{
  "a_string": "hello",
  "a_number": 42,
  "a_boolean": true,
  "a_null": null,
  "an_object": { "nested": true },
  "an_array": [1, 2, 3]
}
JS 에는 있는데 JSON 엔 안 들어가는 것·javascript
// 이건 다 JSON.stringify 에서 죽거나 모양 바뀜:
undefined         // object 키에선 부재, array slot 에선 null
function(){}      // 부재
NaN, Infinity     // null 됨
123n              // BigInt — TypeError
new Date()        // "2026-05-04T01:30:11.000Z" (string)
new Map()         // {} (빈 object)
new Set()         // {} (빈 object)
Symbol('x')       // 부재
Reviver 로 Date 라운드트립·javascript
const text = '{"created_at":"2026-05-04T01:30:11.000Z"}';
const data = JSON.parse(text, (key, value) => {
  if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T/.test(value)) {
    return new Date(value);
  }
  return value;
});
console.log(data.created_at instanceof Date);  // true

External links

Exercise

최근에 직렬화한 Python dict 나 JS object 하나 골라. 안에 든 타입을 전부 적어봐. 그리고 하나씩 물어. 이게 JSON 의 여섯 타입 중 하나야? 아니라면 json.dumpsJSON.stringify 를 통과하면 뭐가 되지? 딱 안 맞아떨어지는 자리가 왕복 버그가 사는 자리야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.