JSON! 이름은 많이 들어보았는데 오늘이 JSON에 대해 공부하는 날이었다. JSON은 (javaScript Object Notation)의 줄임말로, 데이터 교환을 위해 만들어진 객체 형태의 포맷이다. 또 JSON 구조는 재귀 함수를 사용할 수 있는 Tree 구조라고 한다. 처음 내용을 접했을때 잘 와닿지 않는 개념이었지만 주어진 과제를 풀면서 어떤 객체 내용을 다른 프로그램에게 전송하고 또 전송 받을때 사용한다는것을 알 수 있었다.
네트워크를 통해, 어떤 객체 내용을 다른 프로그램에게 전송한다고 가정했을때 이 객체 내용을 일종의 메신저 혹은 채팅 프로그램에서 쓰는 하나의 메시지라고 한다면, 다음 객체를 어떻게 전송할 수 있을까?
const message = {
sender: "김코딩",
receiver: "박해커",
message: "해커야 오늘 저녁 같이 먹을래?",
createdAt: "2021-01-12 10:10:10"
}
메시지 객체가 전송 가능하려면, 메시지를 보내는 발신자와 메시지를 받는 수신자가 같은 프로그램을 사용하거나, 문자열처럼 범용적으로 읽을 수 있는 형태여야 한다.
객체는 타입 변환을 이용해 String으로 변환할 경우 객체 내용을 포함하지 않는다. JavaScript에서 객체에 메소드(message.toString())나 형변환(String(message))을 시도하면, [object Object] 라는 결과를 리턴한다. 이 문제를 해결하는 방법은 객체를 JSON의 형태로 변환하거나 JSON을 객체의 형태로 변환하는 방법이다.
JSON.stringify : Object type을 JSON으로 변환한다. (stringify하는 이 과정을 직렬화한다고 한다.)
let transferableMessage = JSON.stringify(message)
console.log(transferableMessage) // `{"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}`
console.log(typeof(transferableMessage)) // `string`
JSON.parse : JSON을 Object type으로 변환한다. (JSON.parse를 적용하는 이 과정을 역직렬화 한다고 한다.)
let packet = `{"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}`
let obj = JSON.parse(packet)
console.log(obj)
/*
* {
* sender: "김코딩",
* receiver: "박해커",
* message: "해커야 오늘 저녁 같이 먹을래?",
* createdAt: "2021-01-12 10:10:10"
* }
*/
console.log(typeof(obj))
// `object`
이처럼, JSON은 서로 다른 프로그램 사이에서 데이터를 교환하기 위한 포맷이다. 그리고 JSON 포맷은 자바스크립트을 포함한 많은 언어에서 범용적으로 사용하는 유명한 포맷이다.
JSON을 얼핏 보기에 자바스크립트의 객체와 별반 다를 바가 없어 보이지만, 자바스크립트의 객체와는 미묘하게 다른 규칙이 있는데, 자바스크립트의 키는 따옴표 없이 쓸 수 있지만 JSON은 반드시 큰 따옴표를 붙여야 한다. 또 자바스크립트의 문자열 값은 어떠한 형태의 따옴표도 사용 가능하지만 JSON의 경우 반드시 큰 따옴표로 감싸야만 한다. 또한 JSON은 키와 값 사이, 그리고 키-값 쌍 사이에는 공백이 있어서는 안된다. 췟 !