language/javascript
JSON 개념정리
건망디
2021. 11. 26. 14:34
- HTTP
Client와 Server가 어떻게 Hypertext를 주고받으며 통신할 수 있는지 정의한 것
Client가 data request, Server는 적절한 response 전송
- AJAX (Asynchronous JavaScript And XML)
HTTP를 이용해서 Server로부터 data 받아올 때 사용하는 방법
웹페이지에서 동적으로 Server와 data 주고받을 수 있는 기술
ex) XHR (XMLHttpRequest), fetch() API
- XML
Mark up 언어 중 하나
HTML과 같이 data를 표현할 수 있는 한 가지 방법
불필요한 태그들이 많이 들어가서 파일 크기가 커지고, 가독성이 나빠진다.
- JSON (JavaScript Object Notation)
{ key : value } 형태의 string type
data 주고받을 때 쓸 수 있는 간단한 data format
프로그래밍 언어나 플랫폼에 상관없이 쓰일 수 있다.
1. JSON 공부방법
- object를 어떻게 serialize(직렬화) 해서 JSON으로 변환할지
- serialize(직렬화)된 JSON을 어떻게 deserialize 해서 object로 다시 변환할지
- 위의 두 가지에 초점을 맞춰서 공부할 것!
1-1. parse와 stringify API
- JSON 인터페이스 안에는 parse와 stringify API가 있다.
- 오버로딩: 함수 이름은 동일하지만, 어떤 파라미터를 전달하느냐에 따라 다른 방식으로 호출 가능한 것
- parse: JSON에 string data를 넣으면 어떤 type의 object로 변환이 되고, optional type의 reviver 콜백함수가 있다. string을 object로 변환할 때 object가 만들어지는 과정을 세밀하게 조정할 때 reviver 사용.
- stringify: 어떤 type의 object를 받아와서 string type으로 변환한다. string으로 만들 때 replacer라는 optional한 콜백함수를 사용하면, 세밀한 조정이 가능하다.
2. Object to JSON
// stringify(obj)
let json = JSON.stringify(true);
console.log(json); // true
json = JSON.stringify(['apple', 'banana']);
console.log(json); // ["apple", "banana"]
const rabbit = {
name: 'tori',
color: 'white',
size: null,
// js에서 자체로 들어있는 특별한 data(symbol 등)도 JSON에 포함되지 않는다.
symbol: Symbol("id"),
birthDate: new Date(),
// 함수는 object에 있는 data가 아니므로, JSON에서 제외된다.
jump: () => {
console.log(`${name} can jump!`);
},
};
json = JSON.stringify(rabbit);
console.log(json);
json = JSON.stringify(rabbit, ["name"]); // 원하는 property만 JSON으로 변환
console.log(json);
json = JSON.stringify(rabbit, ['name', 'color', 'size']);
console.log(json);
json = JSON.stringify(rabbit, (key, value) => {
console.log(`key: ${key}, value: ${value}`);
return key === 'name' ? 'ellie' : value;
});
console.log(json);
- rabbit이라는 object에는 jump라는 method가 있다.
- rabbit object를 JSON으로 변환할 때 함수가 포함되지 않고, data만 JSON으로 변환
3. JSON to Object
// parse(json)
json = JSON.stringify(rabbit);
const obj = JSON.parse(json);
console.log(obj);
rabbit.jump(); // can jump!
obj.jump(); // error
console.log(rabbit.birthDate.getDate()); // 정상 출력
console.log(obj.birthDate.getDate()); // error
const obj = JSON.parse(json, (key, value) => {
console.log(`key: ${key}, value: ${value}`);
return key === 'birthDate' ? new Date(value) : value;
// 조건에 부합하면, birthDate를 Date 형태로 변환
});
console.log(obj.birthDate.getDate()); // 정상 출력
- 변환된 JSON을 다시 object로 변환할 때 method는 포함되지 않는다.
- JSON으로부터 만들어진 obj object는 method를 호출하면 에러가 발생한다.
- rabbit의 birthDate는 Date type의 object이다. Date의 getDate() API를 사용할 수 있다.
- obj의 birthDate는 string이기 때문에, getDate() API를 사용하면 에러가 발생한다.
참고
youtube 드림코딩 by 엘리
https://www.youtube.com/watch?v=FN_D4Ihs3LE&list=PLv2d7VI9OotTVOL4QmPfvJWPJvkmv6h-2&index=10