체인의정석

날짜를 포함한 json 파일을 생성하고 원래 형태로 읽어오는 법 본문

개발/backend

날짜를 포함한 json 파일을 생성하고 원래 형태로 읽어오는 법

체인의정석 2022. 11. 11. 11:52
728x90
반응형

상황 : 데이터베이스가 있는 상황에서 이를 메모리로 옮겨야 하는 상황

makeJson의 data안에 각 쿼리문의 select 결과문을 넣어서 파일을 만들고,

해당 파일을 만들어서 filter, map등을 이용해 원래 데이터를 읽어와야 하는 상황이다.

 

async function makeJson (filename, data) {
    await fs.writeFileSync(`${__dirname}/${filename}.json`, JSON.stringify(data, null, 1));
    logger.log(`${filename} updated to ${__dirname}/${filename}.json`);
}

1. writeFileSync 동기 처리를 하면서 파일을 생성한다. 함수에도 async를 걸어주면 동기처리가 된다.

 

2. __dirname 현재 경로를 의미한다.

파일생성시 경로를 정해줄 때 사용하였다.

 

3. JSON.stringify

 

Json 형태로 만드는데 날짜나 함수는 지원하지 않는다.

옵션이 2가지가 있는데

2번째 요소는 함수나 배열등을 넣어서 JSON 형태로 바꿀 요소들을 선택하는 과정이다.

마지막 요소는 숫자를 넣어서 JSON간의 데이터 사이에 간격을 설정해 주는것이다.

(data, null, 1)로 해두면 모든 data의 요소들을 대상으로 간격을 1 씩으로 벌려주게 된다.

 

아래 블로그가 잘 나와 있다.

https://blog.naver.com/pxkey/221286404342

 

JSON.stringify 메서드의 Replacer 옵션

안녕하세요. 창작자 픽케입니다. 네트워크 통신을 위한 범용 데이터 교환 형식인 JSON은 자바 스크립트...

blog.naver.com

4. JSON.parse

문자열 형태의 JSON 을 다시 JSON객체로 가져오는 것이다.

첫번째 인자는 데이터

두번째 인자는 reviver라고 하여 데이터를 가져올 때 데이터를 변형시켜서 돌려주는 함수를 넣어주면 된다.

 

이를 힌트로 날짜 값을 복원하는 JSON.parse를 구현한 케이스를 찾아봤다.

https://stackoverflow.com/questions/1792865/how-to-use-json-parse-reviver-parameter-to-parse-date-string

 

How to use JSON.parse reviver parameter to parse date string

My JSON string contains a date field that returns such a value: "2009-04-04T22:55:16.0000000-04:00" I am particularly interested in parsing only the date compartment not the time. I tried using a

stackoverflow.com

var dateReviver = function (key, value) {
    var a;
    if (typeof value === 'string') {
        a = Date.parse(value);
        if (a) {
            return new Date(a);
        }    
    }
    return value;
}

reviver 자리에 이걸 넣으면 date 객체가 생성된다고 했다.

그래서 dateReviver를 정의한 후에 거슬리는 var만 let과 const로 변경하였다.

const dateReviver = function (key, value) {
  let a;
  if (typeof value === 'string') {
      a = Date.parse(value);
      if (a) {
          return new Date(a);
      }    
  }
  return value;
}

JSON.parse(JSON.stringify(data),dateReviver);

잘 작동하는 것을 확인했고, Mocha를 통하여 쿼리문과 JSON에서 메모리에서 읽어온 것과 같은 값이 나오는 것을 확인하였다.

 

반대로 이걸 읽어와서 수정하고 다시 쓰는 방법은

 const jsonData = JSON.parse(fs.readFileSync(`${__dirname}/${filename}.json`, {encoding : 'utf8'}))

이렇게하면 filter를 쓰고 배열에다가 결과값을 담는 형태로 데이터를 또 바꿔서 다시 파일을 쓸 수도 있다.

728x90
반응형
Comments