본문 바로가기

Backend/Javascript

[Javascript] - JSON

JSON

 

- 표준화

 

JSON 의 기본 철칙은 텍스트 형태를 유지하고, 최소한으로, 자바스크립트의 일부로 유지하는 것이었습니다.

표준은 간단하고 완전해야 하며, 동의해야 하는 부분이 적을수록 상호 운용하기도 쉽습니다.

 

- 따옴표

 

자바스크립트는 문자열에 홑따옴표나 겹따옴표 둘 다를 허용합니다.

속성 이름은 따옴표로 둘러싸게 했습니다. ES3 의 예약어 목록은 집어넣지 않았습니다.

JSON 에선 둘 다 허용할 필요가 없는데 이렇게 한 이유는, 사람들이 자바스크립트로 개발하도록 만들고 싶었기에, JSON 표준이 자바스크립트의 나쁜 부분을 들춰선 안 된다고 생각해서 입니다.

 

- 주석

 

JSON 은 네트워크 상에서 서로 다른 언어들로 만들어진 프로그램들을 연결하는 것이 목적이었습니다.

주석은 항상 무시당하기ㄷ 때문에 주석을 쓰면 네트워크 성능이 떨어집니다. 고로 주석은 빠지게 되었습니다.

 

정말 주석이 필요하다면 주석이 포함된 텍스트를 jsmin 같은 최소화 도구로 전달하는 방법이 있습니다.

또는 주석을 형식화해서 JSON 구조에 넣으면 됩니다.

 

- 그 외에..

 

infinity 와 NaN 이 데이터에 있다는 것은 데이터가 잘못되었다는 것을 뜻하기 때문에 빠졌습니다.

(데이터에 잘못된 데이터가 있으면 안 되고, 혹여 있더라도 전파해선 안됩니다)

10진 지수 표기를 위해서 e 와 E 둘 다 포함시켰습니다.

null 은 포함시켰습니다.

 

- JSON 이 동작할 수 있는 이유

 

JSON 은 서로 다른 언어로 만들어진 프로그램끼리도 효율적으로 통신할 수 있도록 하기 위해 만들어졌습니다.

어떤 언어는 정수형이 있지만 자바스크립트는 정수형이 없습니다. 하지만 JSON 에서는 숫자로 이루어진 문자열로 가능한 모든 표현을 할 수 있습니다.

 

이처럼 모든 프로그래밍 언어의 공통점을 찾음으로써 서로 다른 언어로 만들어진 모든 프로그램이 서로 통신할 수 있게 만들었습니다.

 

- JSON 객체

 

자바스크립트는 JSON 객체의 두 함수 parse 와 stringify 를 통해 JSON 을 지원합니다.

(사실 이 두 함수 이름은 decode 와 encode 로 했어야 한다고 말합니다)

 

- JSON.parse(text, reviver)

 

parse 함수는 JSON 텍스트를 전달받아 자바스크립트 데이터로 디코드합니다.

reviver 함수는 변환을 수행합니다. 예를 들어 이 함수를 통해 날짜 문자열을 날짜 객체로 변환할 수 있습니다.

 

const text = '{"reg_date": "2021-01-01", "reg": "2021-01-01"}';
const result = JSON.parse(text, (key, value) => {
  return (typeof value === 'string' && key.endsWith('_date') ? new Date(value) : value);
});

console.info(result); // { reg_date: 2021-01-01T00:00:00.000Z, reg: '2021-01-01' }

 

- JSON.stringify(value, replacer, space)

 

stringify 함수는 값을 받아서 JSON 텍스트로 인코딩합니다.

replacer 함수 역시 변환을 수행합니다. 위와 비슷한 예시로 Date 객체를 ISO 문자열로 바꿀 수 있습니다.

 

const obj = { reg_date: new Date('2021-01-01'), reg: '2021-01-01' };
const json_text = JSON.stringify(obj, (key, value) => {
  return (value instanceof Date ? value.toISOString() : value);
});

console.info(json_text); // '{"reg_date":"2021-01-01T00:00:00.000Z","reg":"2021-01-01"}'

 

위 예시는 사실 이미 Date.prototype.toJSON 이 해 주기 때문에 필요 없습니다.

 

space 매개변수를 쓰게 되면 줄 바꿈 문자와 들여쓰기를 삽입합니다. indentation 된다고 보면 이해하기 쉬울 것 같습니다.

위 예시를 그대로 사용해서 space 매개변수에 4를 넣으면, 이렇게 출력됩니다.

 

const json_text = JSON.stringify(obj, (key, value) => {
  return (value instanceof Date ? value.toISOString() : value);
}, 4);

console.info(json_text);
/*
'{
    "reg_date": "2021-01-01T00:00:00.000Z",
    "reg":"2021-01-01"
}'
*/

 

- 데이터 교환 표준 설계자들을 위해

 

자세히 적진 않겟지만 JSON 이 아닌 다른 데이터 표준을 설계할 사람들에게 몇 가지 당부하는 포인트가 있습니다.

 

‣ JSON 을 파괴하지 마세요

 

버전 번호 없이 단 하나의 표준 버전만 있는 JSON 은 그 자체로 안정적입니다.

 

‣ 훨씬 더 낫게 만드세요

 

실질적이고 가치있어야 합니다.

 

‣ 더 좋은 이름을 붙이세요

 

JSON 이름의 뜻은 자바스크립트 객체 표기법 (JavaScript Object Notation) 입니다.

이는 마치 자바스크립트에서만 사용할 수 있다고 생각되기도 합니다.

이름에 Object (객체) 가 들어가 있어서 객체 직렬화 형식처럼 보이지만, JSON 은 데이터 직렬화 형식입니다.

데이터 형식을 '표기법' 이라고 부르는 부분도 조금 이상합니다.

 

출처 : 자바스크립트는 왜 그 모양일까?

'Backend > Javascript' 카테고리의 다른 글

[Javascript] - Optimization  (0) 2021.02.06
[Javascript] - Testing  (0) 2021.01.30
[Javascript] - Date  (0) 2021.01.16
[Javascript] - Asynchronous Programming  (0) 2021.01.09
[Javascript] - Purity  (0) 2021.01.02