JS LAB
JS 3.8 · 3부. 데이터 다루기

JSON과 데이터 형태

JSON.stringify 와 parse 로 데이터를 글자와 객체 사이에서 옮깁니다.

예상 학습 시간 15분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 중급
개념 설명

객체를 글자로, 글자를 객체로

객체는 프로그램 안에서만 존재합니다. 서버로 보내거나 파일로 남기려면 글자로 바꿔야 합니다. 그 약속된 형식이 JSON 입니다.

이름은 JavaScript Object Notation 이지만 지금은 거의 모든 언어가 사용합니다. 서버에서 받아 오는 데이터도 대부분 JSON 입니다(5부).

최소 예제 · 편집 가능

바꾸고 되돌리기

script.js
const person = { name: "홍길동", age: 27 };

const text = JSON.stringify(person);
console.log(text);
console.log(typeof text);

const back = JSON.parse(text);
console.log(back.name);
console.log(typeof back);
출력
{"name":"홍길동","age":27} string 홍길동 object

stringify 는 객체를 글자로, parse 는 글자를 객체로 되돌립니다. 글자가 된 뒤에는 .name 으로 꺼낼 수 없습니다 — 그냥 글자입니다.

상세 사용법

JSON 의 규칙

객체를 적는 방식과 비슷하지만 더 엄격합니다.

  • 속성 이름에도 큰따옴표가 붙습니다.
  • 작은따옴표를 사용할 수 없습니다.
  • 마지막 쉼표를 남길 수 없습니다.
  • 주석을 넣을 수 없습니다.
script.js
console.log(JSON.parse('{"name": "홍길동"}'));
console.log(JSON.parse("{'name': '홍길동'}"));
출력 · 크롬
{ name: "홍길동" } SyntaxError: Expected property name or '}' in JSON at position 1 (line 1 column 2)
출력 · 파이어폭스
{ name: "홍길동" } SyntaxError: JSON.parse: expected property name or '}' at line 1 column 2 of the JSON data

잘못된 글자를 parse 하면 오류가 납니다. 밖에서 받아 온 데이터를 다룰 때는 try...catch 로 감쌉니다(5.4).

상세 사용법

보기 좋게 내보내기

script.js
const person = { name: "홍길동", age: 27 };

console.log(JSON.stringify(person, null, 2));
출력
{ "name": "홍길동", "age": 27 }

세 번째 인자가 들여쓰기 칸 수입니다. 사람이 읽을 때만 사용하고, 서버로 보낼 때는 붙이지 않습니다.

상세 사용법

담기지 않는 것

script.js
const data = {
	name: "홍길동",
	greet: () => "안녕",
	when: undefined,
	nothing: null
};

console.log(JSON.stringify(data));
출력
{"name":"홍길동","nothing":null}

함수와 undefined 는 사라집니다. null 은 남습니다. 데이터가 왜 빠졌는지 모를 때 이것을 의심해 보세요.

상세 사용법

서버에서 받는 모양

실제로 받아 오는 데이터는 객체가 담긴 배열입니다. 5부에서 이런 글자를 받아 parse 한 뒤 3부에서 배운 방법으로 다룹니다.

script.js
const received = '[{"name":"연필","price":1000},{"name":"공책","price":2000}]';

const products = JSON.parse(received);

console.log(products.length);
console.log(products[0].name);
console.log(products.reduce((sum, p) => sum + p.price, 0));
출력
2 연필 3000
흔한 실수

처음에 자주 걸리는 것

1. 글자인 채로 속성을 꺼냅니다

stringify 한 뒤에는 글자입니다. .nameundefined 입니다. parse 를 먼저 하세요.

2. 작은따옴표로 적은 글자를 parse 합니다

JSON 은 큰따옴표만 허용합니다. 손으로 적은 데이터에서 자주 나옵니다.

SyntaxError: Expected property name or '}' in JSON at position 1
3. 깊은 복사에 사용합니다

JSON.parse(JSON.stringify(x)) 로 복사하는 방법이 알려져 있지만, 함수와 undefined 가 사라지고 날짜가 글자로 바뀝니다. 간단한 데이터에만 사용하세요.

실습 문제

직접 해보기

1. 오갔다 돌아오기 난이도 하

상품 객체를 글자로 바꿔 출력하고, 다시 객체로 되돌려 이름만 출력하세요.

const item = { name: "연필", price: 1000 }; const text = JSON.stringify(item); console.log(text); console.log(JSON.parse(text).name);
2. 안전하게 되돌리기 난이도 중

글자를 받아 객체로 되돌리되, 형식이 잘못되었으면 null 을 돌려주는 함수를 만드세요.

try { } catch { } 로 감싸면 오류가 나도 실행이 멈추지 않습니다. 5.4 에서 자세히 다룹니다.
function safeParse(text) { try { return JSON.parse(text); } catch { return null; } } console.log(safeParse('{"a":1}')); console.log(safeParse("망가진 글자"));
실습 문제

파트 3 미니 실습 — 상품 필터·정렬기

3부에서 배운 것을 모아 봅니다 난이도 상

서버에서 받은 것으로 치고, 아래 글자를 객체 배열로 되돌려 다음을 차례대로 출력하세요.

const received = '[{"name":"연필","price":1000,"stock":3},{"name":"공책","price":2000,"stock":0},{"name":"지우개","price":500,"stock":7},{"name":"자","price":1500,"stock":2}]';
  • 재고가 있는 상품만 골라 가격이 비싼 순서로 이름을 한 줄에 출력
  • 그 상품들의 가격 합계
  • 품절 상품이 하나라도 있는지
  • 가장 상품의 이름
거르고(filter) → 정렬하고(sort) → 이름만 뽑아(map) → 잇습니다(join). 정렬은 원본을 바꾸므로 차례에 주의하세요(3.5).
const received = '[{"name":"연필","price":1000,"stock":3},{"name":"공책","price":2000,"stock":0},{"name":"지우개","price":500,"stock":7},{"name":"자","price":1500,"stock":2}]'; const products = JSON.parse(received); const inStock = products.filter(p => p.stock > 0); const names = inStock .slice() .sort((a, b) => b.price - a.price) .map(p => p.name) .join(", "); const total = inStock.reduce((sum, p) => sum + p.price, 0); const soldOut = products.some(p => p.stock === 0); const cheapest = inStock.reduce((min, p) => p.price < min.price ? p : min); console.log(names); console.log(total); console.log(soldOut); console.log(cheapest.name);

값을 바꿔 가며 확인해 보세요. 여기까지 하면 파트 3 이 끝납니다. 다음 파트부터는 화면을 다룹니다.

요약

이 단원의 정리

  • JSON.stringify 는 객체를 글자로, JSON.parse 는 글자를 객체로 바꿉니다.
  • JSON 은 속성 이름에도 큰따옴표가 붙습니다. 작은따옴표와 주석을 사용할 수 없습니다.
  • 함수와 undefined 는 담기지 않습니다.
  • 잘못된 글자를 parse 하면 오류가 납니다.
  • 서버에서 받는 데이터는 대부분 객체가 담긴 배열입니다.