https://youtu.be/FN_D4Ihs3LE
드림코딩 by 엘리 님의 유튜브 강의를 보며 정리한 내용입니다.
JavaScript Object Notation
JSON 예) 우리의 Web Application에 🐰 라는 오브젝트가 있다면, 이 🐰(토끼) object를 server에 전송할 때는 토끼라는 object를 {key:value}에 string 타입으로 변환해서 서버에 전송하게 되고, server에서 다시 🐰를 받아올 때도 이렇게 {key:value}에 string 타입으로 🐰를 전송받아와서 다시 토끼라는 오브젝트로 변환해서 브라우저에 표기한다.
✨ 그럼 이제 JSON에 대해서 알아 볼 두가지는 다음과 같다!
serialize
(직렬화) 해서 JSON으로 변환할지!deserialize
해서 object로 변환할지!JSON 이라는 object에 있는 두가지 API 중 stringify를 이용하면 간단하게 할 수 있다 🙂
let json = JSON.stringify(true); //boolean type의 primitive type도 JSON으로 변환이 가능하다 👌🏻
console.log(json); //true
json = JSON.stringify(['apple', 'banana']);
console.log(json); //["apple", "banana"] ...배열 타입처럼 보여면서 double quote 로 변경된다.
💡 Double quote
로 나오는것은 JSON의 규격사항이다!
const rabbit = {
name: 'berry',
color: 'white',
size: null, //null도 되는지 한번 넣어 보았다.
birthDate: new Date(), //Date라는 오브젝트를 정의해 보았다.
jump: () => {
console.log(`${this.name}` can jump!`);
},
};
json = JSON.stringify(rabbit); //rabbit 오브젝트를 JSON으로 변환
console.log(json);
//{"name":"berry","color":"white","size":json.null,"birthDate":"2020-05-29T13:20:22.670Z"}
//Date란 오브젝트가 string 으로 변환되어서 json으로 만들어졌다.
//그런데 jump라는 함수는 json에 포함되어 있지 않다.
//왜냐하면 함수는 오브젝트에 있는 데이터가 아니기 때문이다.
//그리고 자바스크립트 자체에 있는 Symbol 같은 데이터도 JSON에 포함되지 않는다.
💡 object는 string 타입으로 변환
되어 json으로 만들어진다.
💡 json으로 변환될 때 함수
는 제외된다.
💡 자바스크립트 자체
에 있는 Symbol같은 데이터도 JSON에 포함되지 않는다.
JSON으로 변환된는 것을 조금 더 통제하고 싶다면, replacer
를 사용해 콜백함수(혹은 배열형태)를 전달한다.
json = JSON.stringify(rabbit, ["name"]); //name 속성만 배열로 전달하기
console.log(json);// {name: "berry"}
json = JSON.stringify(rabbit, ["name","color"]); //name,color 속성만 배열로 전달하기
console.log(json); // {"name":"berry", "color":"white"}
→ 이렇게 Object의 내용 중에서 특정 속성(=key or property)만 JSON 형식으로 변환시키고 싶다면 replacer에 원하는 property 만 골라서 정의하면 된다. 그럼 원하는것만 JSON으로 변환이 된다.
→ 조금 더 세밀하게 통제하고 싶을 땐, 콜백함수를 replacer 에다가 이렇게 이용할 수 있다.
json = JSON.stringify(rabbit, (key, value) => {
console.log(`key: ${key}, value: ${value}`);
return key === 'name' ? 'James' : value; //삼항연산자를 이용한 초기화
//만약에 key가 name이면 무조건 'James'라는 value로 설정하고,
//key가 name이 아닌 경우에는 그냥 원래 original value 를 써줘.
});
console.log(json); //{"name" : "James" .. 로 바뀐다! ..}
→ key가 name인 것만 value가 바뀌고, 나머지 key들은 그대로 나왔다. ✨
JSON object에 있는 두가지 API 중 parse를 이용해서 우리가 변환하고 싶은 json을 전달해 주기만 하면 된다 🙂
json = JSON.stringify(rabbit);
//이렇게 1. Object to JSON 에서 rabbit 오브젝트를 json으로 변환 햇었다.
//이제 반대로 json으로부터 object를 만들어 본다.
const obj = JSON.parse(json) //변환하고 싶은 json을 전달해준다.
console.log(obj);
//{name: "berry", color: "white", size: null, Date: "2020-05-29T13:32:57/757Z"}
→ 🤚🏻 원래의 rabbit object
에는 jump 라는 함수가 있었는데, 우리가 변환한 object(obj)
에는 jump라는 api가 없어졌다.
함수가 사라진 이유는 우리가 변환한 object는 string으로 만들어진 JSON으로부터 다시 만든 object 인 것이기 때문이다. serialize
될 때 함수는 포함이 되지 않았으므로 당연히 다시 JSON으로부터 object를 만드는 것에는 Jump 라는 API가 없게 된 것이다.
rabbit.jump(); //can jump! ...rabbit 에는 있는데,
obj.jump(); //이렇게 다시 변환해온 obj 오브젝트에는 method가 없기 때문에 에러가 발생한다.
🚨 JSON은 key와 value 형식으로 구성된 data만 받고 전달할 수 있다. 그러므로 함수는 전달할 수 없다.
또 한가지 중요한 포인트는! 아까 토끼(rabbit)에는 birthDate라는 오브젝트가 있었는데, 이건 Date라는 오브젝트
이다.
→ Date 오브젝트
는 getDate 라는 api를 쓸 수 있는데! json으로부터 만든 오브젝트에 있는 birthDate에다가 getDate( )를 출력하게되면.. error가 발생한다. 왜냐하면 이 birthDate는 그냥 string이기 때문이다!
console.log(rabbit.birthDate.getDate()); //29 ...29라는 숫자가 나온다.
console.log(obj.birthDate.getDate()); //Uncaught TypeError: obj.birthDate.getDate is not a functino ..에러발생
🚨 생성된 Date객체에 의해 전달된 값(value)은 object → JSON 또는 JSON → object로 변환할 수 있지만, 값(value)만 전달되는 것이지 Date 객체 자체가 전달되는 것이 아니다. 이 점을 유의해서 코드를 짜야한다.
🤔 그럼 진짜 다시 date로 변환하고 싶을 땐 어떻게하지? → 콜백함수를 이용하면 된다!
JSON 형식의 data를 받아서 object 형식으로 변환할 때 개발자가 원하는대로 형태를 변경하기 위해서 reviver
를 사용한다. 그러면 reviver 함수를 인수로 전달할 경우, 결과를 반환하기 전에 변형할 수 있다.
const obj = JSON.parse(json, (key, value) => {
console.log(`key: ${key}, value: ${value}`);
return key === 'birthDate' ? new Date(value) : value;
});
console.log(obj.birthDate.getDate()); //29 ...이제 다시 성공!
✨ key와 value에 parameter를 받아서 무언가를 처리하는 콜백함수를 전달해준다.
✨ 여기서 무언가를 처리하는 것은 다음의 두개이다.