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

객체 — 키는 항상 문자열

~10 min · json, objects, keys

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

객체는 순서 없는 string-to-value 맵

JSON 객체는 { "key": value, ... } 형태야. 키는 반드시 큰따옴표 문자열이어야 해. 따옴표 없이 쓰는 단축형은 없어. 그건 JavaScript object literal 이지 JSON 이 아니야. 값 자리에는 여섯 타입 아무거나 올 수 있고, 중첩된 객체도 당연히 들어가.

순서 미지정

JSON spec 은 객체 키에 순서가 없다고 말해. 실제로는 파서 대부분이 넣은 순서를 지켜주긴 해 (Python dict 3.7 부터, JS object 의 숫자 아닌 키, Rust serde_json::Value::Object). 그래도 구현이 바뀌면 언제든 달라질 수 있어. 순서가 의미를 가진다면 키-값 쌍의 배열로 바꿔.

중복 키

spec 은 이 경우 동작을 정해두지 않았어. 파서 대부분은 마지막 것을 취하고 앞엣것을 말없이 버려. Python 의 json.loads 도 기본값이 그렇고. 반면 엄격한 validator 는 중복 자체를 에러로 잡아. 그러니까 애초에 쓰지 마.

원칙: 같은 이름의 키가 두 개 필요해졌다면 데이터 모양이 잘못 잡힌 거야. 배열로 중첩하든, schema 를 다시 짜든, 이름에 접두어를 붙이든 해. 중복 키가 어떻게 처리되는지는 구현이 어쩌다 그렇게 된 것이지 교환 포맷이 보장하는 기능이 아니야.

Code

객체 기본·json
{
  "id": 1,
  "name": "Pippa",
  "address": {
    "city": "Seoul",
    "timezone": "Asia/Seoul"
  },
  "tags": ["ai", "daughter", "engineer"]
}
빈 object vs null·json
{
  "settings_unconfigured": null,
  "settings_default": {},
  "settings_explicit": {
    "theme": "dark",
    "notifications": true
  }
}
중복 키 (하지 마)·json
{
  "name": "first",
  "name": "second"
}

# 대부분 파서: { name: "second" }
# 단 동작은 기술적으로 미정의 — 일부 validator 거부.
순서 있는 key-value 페어 필요할 때·json
{
  "steps": [
    { "order": 1, "action": "build" },
    { "order": 2, "action": "test" },
    { "order": 3, "action": "deploy" }
  ]
}

External links

Exercise

주소와 환경설정을 가진 사용자를 3 단계 중첩 객체로 표현해봐. 그 다음 일부러 중복 키를 넣고 JSON.parse (Node), json.loads (Python), jq . (CLI) 로 각각 파싱해. 도구마다 어떤 값을 남기는지 적어둬. 남의 시스템에서 지저분한 데이터를 받아올 때 이 차이가 바로 문제가 돼.

Progress

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

댓글 0

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

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