코드스테이츠 9주차 - JSON.stringfy()

씌미씌미·2022년 6월 25일
0

코드스테이츠 SEB_FE

목록 보기
14/14

JSON.stringify()

JSON.stringify는 객체를 JSON으로 변환하는 메소드
직렬화(serialize)라고도 한다.

JSON의 기본 규칙

JSON의 작동 방법

  • Boolean이 input으로 주어졌을 경우
    stringifyJSON(true); // 'true'

  • String이 input으로 주어졌을 경우
    stringifyJSON('foo'); // '"foo"'

  • Array가 input으로 주어졌을 경우
    stringifyJSON([1, 'false', false]); // '[1,"false",false]'

  • Object가 input으로 주어졌을 경우
    stringifyJSON({ x: 5 }); // '{"x":5}'

  • undefined, function이 주어졌을 경우
    stringifyJSON(undefined) // undefined
    stringifyJSON(function(){}) // undefined
    stringifyJSON({ x: undefined, y: function(){} }) // '{}'

JSON.stringify() 구현해보기

<테스트 자료>

const stringifiableObjects = [
  9,
  null,
  true,
  false,
  "Hello world",
  [],
  [8],
  ["hi"],
  [8, "hi"],
  [1, 0, -1, -0.3, 0.3, 1343.32, 3345, 0.00011999],
  [8, [[], 3, 4]],
  [[[["foo"]]]],
  {},
  { a: "apple" },
  { foo: true, bar: false, baz: null },
  { "boolean, true": true, "boolean, false": false, null: null },
  // basic nesting
  { a: { b: "c" } },
  { a: ["b", "c"] },
  [{ a: "b" }, { c: "d" }],
  { a: [], c: {}, b: true },
];

3가지로 나눠볼 수 있다

객체나 배열이 아닌 경우
1) number, null, boolean 문자열로 리턴
2) string 일때는 앞뒤로 "" 추가로 넣어줘야 한다

배열인 경우
Array.isArray로 배열인지 확인한 뒤 stringifyJSON(재귀함수)을 사용해서 새배열에 넣어준뒤 리턴해주면 된다

객체인 경우
객체의 키에 undefined or 값에 함수, undefined 가 들어왔을 경우 {}리턴
나머지 경우에 속성 : 값 형태의 문자열로 저장한 뒤 리턴

function stringifyJSON(obj) {
  if(typeof obj === 'number' || obj === null || typeof obj === 'boolean' ){
    return `${obj}`;
  }
  // typeof obj === null 으로 작성하면 object 이다 
  if(typeof obj === 'string'){
    return `"${obj}"`;
  }
  if(Array.isArray(obj)){
    let newArr = []
    for(let el of obj){
      let arrEl = stringifyJSON(el)
      newArr.push(arrEl)
    }
    return `[${newArr}]`
  }
  // newArr를 ``를 사용해 문자열로 변환시키면 배열 껍데기가 벗겨지므로 배열로 다시 감싸줘야 한다.
  
  // typeof obj에서 배열인 경우를 위에 적어줬기 때문에 배열을 제외시킬 수 있다 
  if(typeof obj === 'object'){
    let newObj = '';
    for(let key in obj){
      let objKey = stringifyJSON(key)
      let objVal = stringifyJSON(obj[key])
      if(objKey === undefined ||typeof objVal =='function' || objVal === undefined){
        newObj = ''
        // 함수와 undefined는 stringify되지 않는다 
      }else{
        newObj += `${objKey}:${objVal},`
        // 속성 : 값 형태의 문자열로 저장
      }
    }
    return `{${newObj.slice(0, newObj.length-1)}}`
  }
  // 문자열 마지막에 포함된 , 를 제거 후 반환 
};
profile
entry software frontend engineer

0개의 댓글