할머니의 콤퓨타 도전기

(JavaScript) JSON 본문

Web Front-end/Javascript

(JavaScript) JSON

ji.o.n.e 2021. 5. 5. 01:02

JSON(JavaScript Object Notation)

  • simplest data interchange format
  • lightweight text-based structure
  • easy to read
  • key-value pairs
  • used for serialization and transmission of data between the network the network connection
  • independent programming language and platform
  • object --> string (serialize)
  • string --> object (deserialize)

Object to JSON

  • stringify(obj)
let json = JSON.stringify(true); // boolean type의 primitive type도 json으로 변환 가능
console.log(json); // true

json = JSON.stringify(['apple', 'banana']); 
console.log(json); // ["apple","banana"]
const rabbit = {
    name: 'tori',
    color: 'white',
    size: null,
    birthDate: new Date(),
    // symbol: Symbol('id'), // javascript 자체에 들어있는 특별한 data도 json에 포함되지 않음
    jump: () => {
        console.log(`${this.name} can jump!`);
    }, // 함수는 object에 있는 data가 아님. 제외됨
};

json = JSON.stringify(rabbit, ['name']); // rabbit object에서 name만 JSON으로 변환 {"name":"tori"}
console.log(json);

json = JSON.stringify(rabbit, ['name', 'color']); // {"name":"tori","color":"white"}
console.log(json);

object 안의 함수나, javascript 자체에 들어있는 특별한 data도 json에 포함되지 않는다. 또한 stringify의 두 번째 파라미터로 다음과 같이 JSON으로 변환하고 싶은 것들만 지정해줄 수 있다.

 

// 세밀하게 통제하고 싶을 때 콜백함수를 이용해서 쓸 수 있음
json = JSON.stringify(rabbit, (key, value) => {
    console.log(`key: ${key}, value: ${value}`);
    return key === 'name' ? 'jiwon' : value;
});

console.log(json); //{"name":"jiwon","color":"white","size":null,"birthDate":"2021-05-04T15:24:05.198Z"}

또한 세밀하게 통제하고 싶을 경우 이처럼 콜백함수를 이용해서 조작이 가능하다.

 

JSON to Object

  • parse(json)
json = JSON.stringify(rabbit);
const obj = JSON.parse(json);
console.log(obj);
rabbit.jump();
// obj.jump(); // error
// 변환한 object는 serialize가 됨. 즉 string으로 만들어진 json으로 부터 다시 object를 만들었기 때문에
// 함수는 serialize 될 때 포함되어있지 않았음

rabbit object에 잇는 jump()를 호출할 경우에는 에러가 발생하지 않지만, JSON에서 변환된 object에서 jump()를 호출할 경우에는 에러가 발생한다. 변환한 object는 serialize가 된다. 즉 string으로 만들어진 json으로 부터 다시 object를 만들었으며 함수는 serialize될 때 포함되어 있지않다.

 

console.log(rabbit.birthDate.getDate()); // 5
// console.log(obj.birthDate.getDate()); // error --> birthDate는 string 형태
console.log(obj.birthDate);

const obj2 = JSON.parse(json, (key, value) => {
    console.log(`key: ${key}, value: ${value}`);
    return key === 'birthDate' ? new Date(value) : value;
});
console.log(obj2.birthDate.getDate()); // no error

마찬가지로 rabbit 객체에 있는 birthDate는 new Date()로 값이 정의되어있다. 따라서 getDate() 호출이 가능하다. 그러나 JSON에서 변환된 obj는 birthDate는 string 형태이다. 따라서 getDate()를 호출하면 에러가 발생한다. 좀 더 세밀하게 통제하고 싶을 경우에 parse()의 두 번째 파라미터로 콜백함수를 전달한다. 위처럼 콜백함수를 작성하게 되면 변환된 object에서 getDate()를 호출해도 에러가 발생하지 않는다.

 

 

JSON 관련 유용한 사이트

'Web Front-end > Javascript' 카테고리의 다른 글

(JavaScript) Promise  (0) 2021.05.05
(JavaScript) Callback  (0) 2021.05.05
(Javascript) Array APIs  (0) 2021.05.04
(Javascript) Object  (0) 2021.05.04
(Javascript) Class vs Object  (0) 2021.05.04
Comments