TL;DR

  • JSON 값(value) 은 JSON 문법에서 허용하는 최상위 데이터 단위이며, 객체·배열·문자열·숫자·true·false·null을 모두 포함한다.
  • JSON 객체(object) 는 중괄호({}) 안에 이름/값 쌍을 담는 구조화 타입으로, JSON 값의 한 종류일 뿐이다.

JSON 값과 JSON 객체의 차이

1. 정의

RFC 8259 기준으로 JSON 텍스트는 하나의 직렬화된 JSON 값이다. 즉 JSON 문서의 최상위에는 반드시 객체만 올 수 있는 것이 아니라, JSON 문법이 허용하는 값 하나가 올 수 있다.

구분의미예시
JSON 값JSON 문법에서 허용하는 단일 데이터 단위{"id": 1}, [1, 2], "hello", 123, true, false, null
JSON 객체이름/값 쌍을 담는 구조화 타입{"id": 1, "name": "Alice"}

따라서 모든 JSON 객체는 JSON 값이지만, 모든 JSON 값이 JSON 객체인 것은 아니다.


2. JSON 값의 종류

JSON 값은 다음 일곱 범주 중 하나다.

JSON value
├─ object: { "name": "kim" }
├─ array: [1, 2, 3]
├─ string: "hello"
├─ number: 123
├─ true
├─ false
└─ null

객체는 이 중 하나의 타입이다. 객체의 각 멤버는 문자열 이름과 JSON 값으로 구성되므로, 객체 안의 값도 다시 객체·배열·문자열·숫자·true·false·null이 될 수 있다.

{
  "id": 1,
  "name": "Alice",
  "tags": ["admin", "beta"],
  "active": true,
  "meta": null
}

3. 최상위 JSON 값 예시

아래 항목들은 각각 독립된 JSON 텍스트로 보면 모두 유효한 JSON 값이다.

{"id": 1, "name": "Alice"}
[1, 2, 3]
"hello"
123
true
false
null

첫 번째만 JSON 객체다. 나머지는 객체가 아니지만, 여전히 유효한 JSON 값이다.


4. NDJSON에서의 의미

NDJSON (Newline Delimited JSON)은 각 줄에 하나의 JSON 텍스트를 쓰고 줄바꿈으로 구분하는 포맷이다. RFC 8259에서 JSON 텍스트는 직렬화된 JSON 값이므로, 엄밀히 말하면 NDJSON의 각 행은 JSON 객체가 아니라 유효한 단일 JSON 값이어야 한다고 설명하는 편이 정확하다.

다만 실무에서는 레코드 단위 처리, 스키마 추론, 로그 분석에 유리하기 때문에 각 행을 객체로 구성하는 경우가 많다.

권장 표현:

개별 행은 유효한 단일 JSON 값이어야 한다. 실무에서는 보통 각 행을 JSON 객체로 구성한다.


5. 주의할 표현

오해 소지가 있는 표현더 정확한 표현
NDJSON은 JSON 객체를 한 줄씩 나열한다.NDJSON은 JSON 값을 한 줄씩 나열한다. 실무에서는 보통 각 값을 객체로 둔다.
JSON은 객체 포맷이다.JSON은 값 직렬화 포맷이며, 객체는 JSON 값의 한 종류다.
{"id": 1}만 JSON이다.객체·배열·문자열·숫자·불리언·null 모두 단일 JSON 값으로 유효하다.

Connections

  • NDJSON (Newline Delimited JSON) — 각 행을 JSON 객체가 아니라 JSON 값/JSON 텍스트로 이해해야 하는 대표 사례
  • SSE vs NDJSON — SSE 프레이밍과 NDJSON 데이터 포맷을 구분할 때 JSON payload의 단위를 명확히 해야 한다
  • UTF-8 — JSON 텍스트 교환에서 사용하는 표준 문자 인코딩