🎯 목표 : 재귀를 이용하여 JSON stringify 구현 할수 있다.
//입력된 값이 문자열일 경우
if(data instanceof String) return "\""+data+"\"";
//입력된 값이 Integer일 경우
if(data instanceof Integer) return String.valueOf(data);
//입력된 값이 Boolean일 경우
if(data instanceof Boolean) return String.valueOf(data);
// 입력 데이터를 조건문으로 확인 해주고 데이터 가공 메소드를 선언
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일 경우
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);
}
}
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}