티스토리 뷰
Client
와 Server
가 어떻게 통신할 수 있는지를 정의한 것이 HTTP
(HyperText Transfer Protocol) 이다.
Client
가 Server
에게 데이터를 request
하고
Server
는 Client
에게 그에 맞는 데이터를 response
한다.
Client
에서 Server
와 통신할 때는 fetch() API
를 사용하거나 XHR
(XMLHttpRequest) Object를 사용할 수 있다.
하지만 XML
을 사용하면 불필요한 태그들이 많이 들어가서 파일의 사이즈가 커지고 가독성도 떨어진다.
따라서 XML
은 최근 많이 사용되지 않고, JSON
을 많이 사용한다.
JSON (JavaScript Object Notation)의 특징
- text를 기반으로 하고 있다.
- 읽기가 편하다.
- key-value 쌍으로 이루어져 있다.
- 데이터를 Server를 주고 받을 때 직렬화를 위해 사용한다.
- 프로그래밍 언어나 플랫폼에 상관 없이 사용할 수 있다.
JSON
이라는 interface
안에는 parse
, stringify
2가지 API가 있다.
함수의 이름은 동일하지만 파라미터에 차이가 있는 것을 오버로딩 이라고 한다.
stringify
: Object
를 받아와서 string
으로 반환해주는 메소드 (직렬화)
parse
: JSON
의 string data
를 받아와서 Object
로 반환해주는 메소드 (역직렬화)
Object to JSON (Serialize)
stringify
를 이용하여 Object
를 JSON string data
로 변환해준다. (직렬화)
let json = JSON.stringify(true);
console.log(true); // true
' '
(single quote) 대신 " "
(double quote) 으로 변환되는 것이 JSON의 규격 사항이다.
json = JSON.stringify(['apple', 'banana']);
console.log(json); // ["apple", "banana"]
함수는 json
에 포함되지 않고 있다.
함수는 Object
에 들어있는 데이터가 아니기 때문에 제외된다.
JavaScript
에만 있는 Symbol
같은 특별한 데이터도 json
에 포함되지 않는다.
const person = {
name: 'jordy',
color: 'green',
size: null,
birthDate: new Date(),
symbol: Symbol("id"),
fly: () => {
console.log(`${name} can fly!`);
},
};
json = JSON.stringify(person);
console.log(json); // {"name":"jordy","color":"green","size":null,"birthDate":"2020-10-05T04:15:45.432Z"}
json
으로 변환되는 것을 더 통제하고 싶다면 array
를 이용하면 된다.
다음과 같이 원하는 property
만 골라서 json
으로 변환시켜줄 수 있다.
const person = {
name: 'jordy',
color: 'green',
size: null,
birthDate: new Date(),
symbol: Symbol("id"),
fly: () => {
console.log(`${name} can fly!`);
},
};
json = JSON.stringify(person, ['name', 'color']);
console.log(json); // {"name":"jordy","color:"green"}
이것보다 더 세밀하게 통제하고 싶다면 key
와 value
를 전달 받는 callback
함수(replacer
)를 이용하면 된다.
key
로 name
이 들어오는 경우만 바꿔주고 나머지는 value
를 그대로 출력해주었다.
const person = {
name: 'jordy',
color: 'green',
size: null,
birthDate: new Date(),
fly: () => {
console.log(`${name} can fly!`);
},
};
json = JSON.stringify(person, (key, value) => {
console.log(`key: ${key}, value: ${value}`);
return key === 'name' ? 'bbbyung2' : value;
});
console.log(json);
// key: , value: [object Object]
// key: name, value: jordy
// key: color, value: green
// key: size, value: null
// key: birthDate, value: 2020-10-05T04:34:36.207Z
// key: fly, value: () => {
// console.log(`${name} can fly!`);
// }
// {"name":"bbbyung2","color":"green","size":null,"birthDate":"2020-10-05T04:36:51.241Z"}
가장 먼저 출력되는 것은 person
의 Object
를 감싸고 있는 가장 최상위의 것이다.
그 이후로 key
, value
쌍이 출력된다.
JSON to Object (Deserialize)
parse 를 이용하여 다시 Object로 반환해준다. (역직렬화)
const person = {
name: 'jordy',
color: 'green',
size: null,
birthDate: new Date(),
fly: () => {
console.log(`${name} can fly!`);
},
};
json = JSON.stringify(person);
const obj = JSON.parse(json);
console.log(obj); // {name: "jordy", color: "green", size: null, birthDate: "2020-10-05T04:40:43.567Z"}
obj.fly(); // VM185:1 Uncaught TypeError: obj.fly is not a function
// at <anonymous>:1:5
직렬화(json
)될 때 함수( fly()
)는 포함되어 있지 않았었기 때문에 다시 역직렬화된 obj
에는 fly()
가 없다.
console.log(person.birthDate.getDate()); // 5
console.log(obj.birthDate.getDate()); // VM643:2 Uncaught TypeError: obj.birthDate.getDate is not a function
// at <anonymous>:2:27
birthDate
는 Date Object
를 갖고 있기 때문에 Date Object
의 API
를 사용할 수 있다.
하지만 obj
의 birthDate
에는 2020-10-05T04:40:43.567Z
이라는 string이 할당되어 있는 상태이다.
Date Object
의 API
를 사용하고 싶을 경우에는 reviver
이라는 callback
함수를 전달해서 해결한다.
const person = {
name: 'jordy',
color: 'green',
size: null,
birthDate: new Date(),
fly: () => {
console.log(`${name} can fly!`);
},
};
json = JSON.stringify(person);
const obj = JSON.parse(json, (key, value => {
console.log(`key: ${key}, value: ${value}`);
return key === 'birthDate' ? new Date(value) : value;
});
console.log(person.birthDate.getDate()); // 5
console.log(obj.birthDate.getDate()); // 5
'JavaScript' 카테고리의 다른 글
[JavaScript] DOM API (0) | 2020.10.11 |
---|---|
[JavaScript] 고차 함수(Higher-Order Function) (1) | 2020.10.01 |
[JavaScript] 1급 시민, 1급 객체 (0) | 2020.09.30 |
[JavaScript] 비동기 처리 방식 - Promise와 async/await (0) | 2020.09.22 |
- Total
- Today
- Yesterday
- javascript
- BOJ
- 위상정렬
- webpack
- Java
- 투포인터
- springboot
- controller
- 최소공통조상
- SCSS
- html
- CSS
- 고차함수
- 파이썬
- js
- MST
- heapq
- 인프런
- 플로이드워셜
- python
- frontend
- 다익스트라
- 백준
- 최소스패닝트리
- 웹팩
- 자바스크립트
- 에라토스테네스의체
- 1급객체
- BFS
- 알고리즘
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |