JSON

Verba volant, scripta manent·2021년 1월 16일
0

JavaScript

목록 보기
20/20
post-thumbnail

JSON

JSON 탄생 배경

JSON(JavaScript Object Notation) : 데이터 교환을 위해 만들어진 포맷

일종의 메신저 혹은 채팅 프로그램에서 쓰는 하나의 메시지라고 간주해볼때, 다음 객체를 어떻게 보낼 수 있을까?

const message = {
  sender: "김코딩",
  receiver: "박해커",
  message: "해커야 오늘 저녁 같이 먹을래?",
  createdAt: "2021-01-12 10:10:10"
}

객체라는 것이 전송 가능(transferable)하려면 애초에 수신자(reciever), 발신자(sender) 모두가 같은 프로그램을 쓰거나, 아니면 문자열과 같이 범용적으로 읽을 수 있는 형태여야만 할 것이다.

혹시나 싶어 message.toString() 메소드나, String(message)를 시도해보았지만, 리턴되는 것은 그저 [object Object]라는 메시지 뿐이었다.

객체는 타입 변환을 이용해 String으로 변환할 경우 객체 내용을 포함하지 않는다.

그래서 다른 방법을 찾기 시작했고, 객체를 문자열로 멋지게 변환하는 JSON.stringify 함수를 mdn을 통해 알아낼 수 있었다.

let transferableMessage = JSON.stringify(message)
console.log(transferableMessage)
// `{"sender":"김코딩","receiver":"박해커","message":"해커야 오늘 저녁 같이 먹을래?","createdAt":"2021-01-12 10:10:10"}`

stringify하는 이 과정을 직렬화(serialize)한다고 한다.

이제는 문자열 그 자체로 누군가에게 객체 내용을 보낼 수 있게 되었다.
이제 수신자는 이 메시지를 어떻게 다시 객체로 만들 수 있을까?

정확히 JSON.stringify와 반대의 일을 하는 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"
}

parse하는 이 과정을 역직렬화(deserialize)라고 한다.

이처럼, JSON은 서로 다른 프로그램 사이에서 데이터를 교환하기 위한 포맷이며, 단순히 자바스크립트에서만 쓰이는 것이 아닌, 여타 다른 언어에서도 범용적으로 쓰이는 아주 유명한 포맷이다.

JSON 규칙

JSON을 얼핏 보기에 자바스크립트의 객체와 별반 다를 바가 없어 보이지만, 자바스크립트의 객체와는 미묘하게 다른 규칙이 있다.

자바스크립트 객체 JSON
키는 따옴표 없이 쓸 수 있다. 반드시 쌍따옴표를
붙여야 한다.
문자열 값 문자열 값은 어떠한 형태의
따옴표도 사용 가능하다.
반드시 쌍따옴표로
감싸야 한다.

또한 JSON은 키와 값 사이, 그리고 키-값 쌍 사이에는 공백이 있어서는 안된다.

function stringifyJSON(obj) {
// obj가 number나 boolean, null, string인 경우
  if(typeof obj === "number" || typeof obj === "boolean") {
    return String(obj);
  }
  if(obj === null) {
    return "null";
  }
  if(typeof obj === "string") {
    return `"${obj}"`;
  }
// obj가 배열인 경우
  let arr = [];
  if(Array.isArray(obj)) {
    for(let i = 0; i < obj.length; i++) {
      arr.push(stringifyJSON(obj[i]));
    }
    return `[${arr}]`;
  }
// obj가 객체인 경우
  let result = "";
  if(typeof obj === "object") {
    for(let key in obj) {
      if(obj[key] === undefined || typeof obj[key] === "function") {
        result = String(result);
      } else {
        result = result + `${stringifyJSON(key)}:${stringifyJSON(obj[key])},`;
      }
    }
    result = result.slice(0,-1);
    return `{${result}}`;
  }
};
profile
말은 사라지지만 기록은 남는다

0개의 댓글