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

문자열 — 항상 큰따옴표

~10 min · json, strings, escapes, unicode

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

문자열은 spec 에서 가장 의견 강한 부분

JSON 문자열은 무조건 큰따옴표로 감싸. 작은따옴표는 아예 안 돼. spec 이 그 부분만큼은 딱 잘라 말해. 자기 언어에서는 둘 다 되는 JavaScript 나 Python 쪽 사람이면 열에 아홉은 여기서 한 번 걸려.

Escape 시퀀스

  • \" — literal 큰따옴표
  • \\ — literal 백슬래시
  • \/ — 슬래시 (옵션 escape, 임베디드 HTML 에 가끔 유용)
  • \b \f \n \r \t — 제어 문자
  • \uXXXX — 16 진수 Unicode 코드 포인트 (네 자리, BMP 범위만. BMP 밖은 surrogate pair 로 써)

JSON 문자열에 raw 로 못 넣는 것

U+0000 부터 U+001F 까지 제어 문자는 반드시 escape 해야 해 (벨 문자면 \u0007 이런 식으로). 문자열 안에 줄바꿈을 그대로 넣으면 문법 오류가 나. 탭도 마찬가지라 \t 로 써야 하고. 에러 메시지는 보통 실제로 깨진 줄이 아니라 그 다음 줄을 가리키면서 'unexpected token' 이라고 나와.

원칙: JSON 문자열은 따옴표로 가려두는 게 아니라 인코딩 하는 거야. 따옴표는 문자를 감추지만 인코딩은 문자를 드러내. 소스에 적힌 \n 은 두 글자고, 파싱된 값은 줄바꿈 한 글자야. 까다로운 문자열을 쓰기 전에는 늘 '파서 눈에는 뭐가 보이지?' 를 먼저 생각해.

Code

유효한 문자열·json
{
  "plain": "hello world",
  "with_quote": "she said \"hi\"",
  "with_newline": "line one\nline two",
  "with_tab": "col1\tcol2",
  "with_backslash": "C:\\Users\\Pippa",
  "with_unicode": "café \u00e9",
  "emoji_via_surrogate": "\uD83D\uDC4B"
}
무효 (각 줄이 파서 깨뜨림)·text
{ 'name': 'Pippa' }            ← single quotes
{ "name": "Pippa, age 5," }    ← OK actually
{ "name": Pippa }              ← unquoted value
{ "name": "line one
line two" } ← raw newline (must be \n)
{ "key": "\j" }                ← unknown escape sequence
실제 API 의 Unicode·json
{
  "user_name": "피파",
  "city": "서울",
  "motto": "AI 동반자, 영원한 가족 💜"
}

External links

Exercise

문자열 값 세 개짜리 JSON object 를 만들어봐. 하나는 큰따옴표를 글자로 품고, 하나는 Windows 파일 경로, 하나는 세 줄짜리 시. python -m json.tool 이나 jq . 로 검증해. 그 다음 escape 를 하나씩 일부러 깨뜨리고 에러 메시지를 읽어. 실제로 만나는 JSON 에러의 열에 아홉은 이 메시지들로 잡게 될 거야.

Progress

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

댓글 0

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

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