[Algorithm] Java 재귀를 이용한 JSON stringify 구현

Gogh·2023년 1월 2일
0

Algorithm

목록 보기
2/10

🎯 목표 :  재귀를 이용하여 JSON stringify 구현 할수 있다.

📒 JSON stringify

📌 JSON

  • ObjectMapper 클래스를 사용하면 자바의 데이터 형식을 JSON 형식으로 포맷하여 데이터를 전달할수 있다.
  • JavaScript Object Notation의 줄임말로, 데이터 교환을 위해 만들어진 객체 형태의 포맷
  • writeValueAsString 메소드를 사용하면 JSON 형태의 String 타입으로 변경 가능하다.
  • 재귀를 학습하였기에 재귀를 이용한 writeValueAsString 와 동일한 기능을 구현 해보았다.

📌 구현 알고리즘

  • 입력 데이터가 String, Integer, Boolean 일 경우
    //입력된 값이 문자열일 경우
    if(data instanceof String) return "\""+data+"\"";
    //입력된 값이 Integer일 경우
    if(data instanceof Integer) return String.valueOf(data);
    //입력된 값이 Boolean일 경우
    if(data instanceof Boolean) return String.valueOf(data);
  • 입력 데이터가 Object [ ] 경우 
    // 입력 데이터를 조건문으로 확인 해주고 데이터 가공 메소드를 선언

 if(data instanceof Object[]) {
     // 비어 있는 배열은 빈배열 반환
     if(((Object[]) data).length==0) return "[]";
     // 데이터 가공 메소드 호출
     String str = modifyArr((Object[]) data);
     // 가공된 데이터를 JSON 형식의 [] 추가
     return "["+str+"]";
 }


 // 입력 데이터 가공 메소드
 private static String modifyArr(Object[] data){
    // 조건문이 포함되어 있는 인스턴스를 생성하고
    stringifyJSON json = new stringifyJSON();
    // 가공 데이터를 저장할 변수 선언
    String result = "";
    // 반복문으로 조건문이 포함되어 있는 메소드 호출하여 요소들 가공
    for(Object o : data) result = result + json.stringify(o)+",";
    // 결과에 마지막 쉼표 제거
    result = result.substring(0,result.length()-1);
    // 결과 반환
    return result;
 }
  • 입력 데이터가 HashMap일 경우
    //입력된 값이 HashMap일 경우
    if(data instanceof HashMap) {
      String str=modifyMap((HashMap<?, ?>) data);
      return "{"+str+"}";
    }
    //지정되지 않은 타입의 경우에는 "null"을 리턴
    return "null";


   	//HashMap 데이터 가공 메소드
 private static String modifyMap(HashMap<?,?> data){
    // 기존 Hashmap 데이터 보전과 순서 유지를 위해 LinkedHashMap으로 복사
    HashMap<?,?> clone = new LinkedHashMap<>(data);
    // 조건문이 포함되어 있는 인스턴스 생성
    stringifyJSON json = new stringifyJSON();
    // 비어있는 HashMap을 빈문자열로 반환
    if(clone.isEmpty()) return "";
    // HashMap 엔트리가 하나 남았을때 가공 데이터를 반환하여 BaseCase를 지정
    else if(clone.size()==1) {
      Object key = clone.keySet().toArray()[0];
      Object value = clone.get(key);
		// key 와 value를 얻어 각 요소들을 조건문 메소드를 호출하여 JSON 형식으로 문자열 가공
      return String.format("%s:%s",json.stringify(key),json.stringify(value));

    } else {
      Object key = clone.keySet().toArray()[0];
      Object value = clone.get(key);
      // key 와 value를 얻어 각 요소들을 조건문 메소드를 호출하여 JSON 형식으로 문자열 가공
      String result = String.format("%s:%s",json.stringify(key),json.stringify(value));
      // 문자열에 저장한 요소를 하나씩 삭제하며,
      clone.remove(key);
	  // 재귀 호출
      return result+","+modifyMap(clone);

    }
  }

📌 전체 코드

  • 재귀 방식으로 입력 받은 데이터를 가공하고 문자열로 반환하는 stringifyJSON 메소드를 작성했다.
    전체코드와 각 TEST 결과 출력값.

public class stringifyJSON {

    public String stringify(Object data) {
        //입력된 값이 문자열일 경우
        if(data instanceof String) return "\""+data+"\"";
        //입력된 값이 Integer일 경우
        if(data instanceof Integer) return String.valueOf(data);
        //입력된 값이 Boolean일 경우
        if(data instanceof Boolean) return String.valueOf(data);
        //입력된 값이 Object[]일 경우
        if(data instanceof Object[]) {
            if(((Object[]) data).length==0) return "[]";
            String str = modifyArr((Object[]) data);
            return "["+str+"]";
        }
        //입력된 값이 HashMap일 경우
        if(data instanceof HashMap) {
            String str=modifyMap((HashMap<?, ?>) data);
            return "{"+str+"}";
        }
        //지정되지 않은 타입의 경우에는 "null"을 리턴합니다.
        return "null";
    }
    private static String modifyMap(HashMap<?,?> data){
        HashMap<?,?> clone = new LinkedHashMap<>(data);
        // 기존 Hashmap 데이터 보전과 순서 유지를 위해 LinkedHashMap으로 복사
        stringifyJSON json = new stringifyJSON();
        if(clone.isEmpty()) return "";
        else if(clone.size()==1) {
            Object key = clone.keySet().toArray()[0];
            Object value = clone.get(key);

            return String.format("%s:%s",json.stringify(key),json.stringify(value));

        } else {
            Object key = clone.keySet().toArray()[0];
            Object value = clone.get(key);
            String result = String.format("%s:%s",json.stringify(key),json.stringify(value));
            clone.remove(key);

            return result+","+modifyMap(clone);

        }
    }
    private static String modifyArr(Object[] data){
        stringifyJSON json = new stringifyJSON();
        String result = "";
        for(Object o : data) result = result + json.stringify(o)+",";
        result = result.substring(0,result.length()-1);
        return result;
    }
}
===== 출력값 =====
null = null
true = true
String = "Hello World"
Object[] = [8,"hi",[18,[20]]]
Hashmap = {"createdAt":"2021-01-12,10:10:10","receiver":"이자바","sender":"김코딩","message":"안녕하세요?"}
Hashmap = {"car":false,"tee":null,"zoo":true}
profile
컴퓨터가 할일은 컴퓨터가

0개의 댓글