StringifyJSON 구현 & StringBuilder

InSeok·2022년 8월 4일
0

TIL

목록 보기
18/51

목차


  1. JSON
  2. 재귀
  3. StringBuilder

배운 내용


**JSON**

  • JavaScript Object Notation

  • 데이터 교환을 위해 만들어진 객체 형태의 포맷

  • 네트워크를 통해, 어떤 객체 내용을 다른 프로그램에게 전송하기 위한 조건

    • 수신자(reciever)와 발신자(sender)가 같은 프로그램을 사용한다.
    • 또는, 문자열처럼 범용적으로 읽을 수 있어야 한다.
  • 객체를 JSON의 형태로 변환

  • jackson 라이브러리에서 제공하는 ObjectMapper클래스를 사용하여 JSON형태로 변경

  • JSON으로 변환된 객체의 타입은 문자열이다.

  • Json의 키와 문자열값은 반드시 “”쌍따옴표로 감싸야한다.

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(message); //직렬화(serialize)

System.out.println(json)
/*
{"createdAt":"2021-01-12,10:10:10","receiver":"박해커","sender":"김코딩","message":"밥먹을래?"}
*/
// readValue메서드를 통해 문자열을 다시 객체형태로 변환
Map<String, String> deserializedData = mapper.readValue(json, Map.class);
System.out.println(deserializedData); //역직렬화(deserialize)

Stringify 직접 구현

import java.util.*;
import java.util.stream.Stream;

public class stringifyJSON {

  public String ObjectMapper(Object data) throws JsonProcessingException {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.writeValueAsString(data);
  }

  public String stringify(Object data) {

//입력된 값이 문자열일 경우
    if(data instanceof  String){
      return String.format("\"%s\"",data);

    }
//입력된 값이 Integer일 경우
    if(data instanceof Integer){
          return String.valueOf((int)data);
    }

//입력된 값이 Boolean일 경우
    if(data instanceof  Boolean){
        if(data.equals(true))
          return "true";
        else if(data.equals(false))
          return "false";

    }

//입력된 값이 Object[]일 경우
    if(data instanceof  Object[]){

      Object[] arr = (Object[])data;
      String[] str = new String[arr.length];
      for(int i = 0; i < str.length; i++)
         str[i] = stringify(arr[i]);

      return Arrays.toString(str).replace(" ", "");
    }

//입력된 값이 HashMap일 경우
    if(data instanceof  HashMap){
      HashMap hashMap = (HashMap) data;
      Set<String> keySet = hashMap.keySet();

      StringBuilder mapAsString = new StringBuilder("{");
      Iterator<String> keyIterator = keySet.iterator();
      if(keySet.size() == 0) return "{}";

      while(keyIterator.hasNext()){
        String key = keyIterator.next();
        Object value = hashMap.get(key);
        mapAsString.append(stringify(key) + ":" + stringify(value) + ", ");

      }
      mapAsString.delete(mapAsString.length()-2, mapAsString.length()).append("}");
      return mapAsString.toString().replace(" ","" );

    }

//지정되지 않은 타입의 경우에는 "null"을 리턴합니다.
    return "null";

  }
}

어려운 내용(에러)


  • Object[] 과 HashMap 안의 요소를 각 자료형에 맞게 분류하여 문자열로 추출하기위해 재귀를 사용
  • HashMap에서 각 key와 value값을 이어 붙이기위해 StringBuilder 사용

StringBuilder

  • 많은 문자열을 연결하면 많은 중간 문자열 객체가 생성되어 비효율적인 코드가 생성된다
  • 자바에서 String 객체는 변경 불가능
  • 하나의 문자열을 다른 문자열과 연결하면 새 문자열이 생성되고, 이전 문자열은 가비지 컬렉터로 들어간다.
  • StringBuilder는 변경 가능 한 문자열을 만들어준다.
public class Main
{
public static void main(String[] args)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("문자열 ").append("연결");
//        String str = stringBuilder;   // String에 StringBuilder를 그대로 넣을 순 없다. toString()을 붙여야 한다
String str = stringBuilder.toString();

}
}

메서드

append()

  • 문자열 추가
	public static void main(String[] args) {
StringBuilder a = new StringBuilder("Hello");

	a.append(" World");
	System.out.println(a); 		// "Hello World"
}

capactiy()

  • 현재 배열이 가진 사이즈 정보를 반환
  • length는 실제 데이터가 들어 있는 문자열 자체의 길이이고, capcity는 현재 배열사이즈
  • 문자열 조정시 배열사이즈가 자동으로 변경됨

delete()

  • 매개변수로 전달받은 인덱스 사이의 문자열 제거
  • parameter : 인덱스 시작점, 인덱스 끝점 + 1

deleteCharAt()

  • 특정 인덱스의 한 문자만 삭제

insert()

  • 특정 위치에 문자열 삽입

reverse()

  • 문자열 거꾸로 뒤집어줌

setCharAt()

  • 특정 위치의 문자 변경

참조 : https://onlyfor-me-blog.tistory.com/317

profile
백엔드 개발자

0개의 댓글