StringifyJSON(실습)

코드스테이츠·2023년 1월 13일
0

JSON이란

JSON은 JavaScript Object Notation의 줄임말로 데이터 교환을 위해 만드렁진 객체형태의 포멧

다른 프로그램 사이에선 데이터를 교환하기 위해

수신자(reciever)와 발신자(sender)가 같은 프로그램을 사용한다.
또는, 문자열처럼 범용적으로 읽을 수 있어야 한다.

중 하나를 만족해야됨

  • JSON은 데이터를 교환하기 위한 포맷중 가장 범용적인 모맷 중 하나
    -데이터를 직렬화
    -데이터를 보냄
    -데이터를 역직렬화
    -데이터를 읽을 수 있음

재귀를 이용해 메서드 stringify를 직접 구현하기

목표

    1. Browser에 존재하는 stringify 함수를 직접 구현
  • stringify 함수는 input 값을 JSON 형식으로 변환한다

    1. stringify는 아래와 같이 작동합니다.
    • Boolean이 input으로 주어졌을 경우
  • stringify(true); // "true"

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

    • null이 주어졌을 경우
  • stringify(null) // "null"

    • HashMap이 input으로 주어졌을 경우
  • HashMap<Object, Object> map = new HashMap<>();

  • map.put("null", 2);

  • map.put("true", "false");

  • stringify(map); // "{"null":2,"true":"false"}"

  • Map 자료형의 Key는 항상 String으로 저장됩니다. null은 입력할 수 없습니다.

  • 예시에 해당되지 않는 자료형의 경우 모두 null을 반환합니다.

    1. test/java/stringifyJSON_test.java의 테스트에서 어떤 input 값들이 주어지고, 어떻게 stringify 주어야 할지 생각해 보세요.
    1. 그냥 테스트 통과를 하고 싶으시다면, 다음과 같이 구현하면 될 거예요.
  • ObjectMapper mapper = new ObjectMapper();

  • return mapper.writeValueAsString(data);

  • 위의 코드는 ObjectMapper 메소드로 이미 구현되어 있습니다. main 클래스에서 직접 사용해보세요!

    코드

    public String stringify(Object data) {
    
       //입력된 값이 문자열일 경우
       if(data instanceof String) {
         return String.format("\"%s\"", data);
       }
    
       //입력된 값이 Integer일 경우
       if(data instanceof Integer) {
         return Integer.toString((Integer) data);
       }
    
       //입력된 값이 Boolean일 경우
       if(data instanceof Boolean) {
         return String.valueOf(data);
       }
    
       //입력된 값이 Object[]일 경우
       if(data instanceof Object[]) {
         Object[] arr = (Object[]) data;
    
         for(int i = 0; i < arr.length; i++) {
           arr[i] = stringify(arr[i]);
         }
    
         return Arrays.toString(arr).replaceAll(" ", "");
       }
    
       //입력된 값이 HashMap일 경우
       if(data instanceof HashMap) {
         HashMap<Object, Object> map = (HashMap<Object, Object>) data;
         HashMap<Object, Object> result = new LinkedHashMap<>();
         for (Map.Entry<Object, Object> entry : map.entrySet()) {
           String key = stringify(entry.getKey());
           String value = stringify(entry.getValue());
           result.put(key, value);
         }
         return result.toString().replaceAll(" ", "").replaceAll("=", ":");
       }
    
       //지정되지 않은 타입의 경우에는 "null"을 리턴합니다.
       return "null";
     }

0개의 댓글