본문 바로가기
Back-End/Java

StringifyJSON

by 달의 조각 2022. 7. 22.

 

JSON

JavaScript Object Notation

 

 

서로 다른 프로그램 사이의 데이터 교환을 위해 사용되는 데이터 타입, 객체 형태의 포맷
자바스크립트을 포함한 많은 언어에서 범용적으로 사용하는 유명한 포맷이다!

→ 데이터 타입을 재귀를 사용하여 직접 JSON타입으로 변경해 보기!
     (null, Boolean, String, Array, HashMap)

 

데이터 전송이 가능한 조건 (transferable condition)

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

Map 인스턴스의 참조 변수를 toString() 시도할 경우,
Java를 사용하지 않는 프로그램에서는 데이터를 정확히 파악할 수 없다

 

 

 

객체 ↔ JSON

 

 

jackson 라이브러리의 ObjectMapper클래스를 사용하여 JSON형태로 변경하기

 

직렬화(serialize) : writeValueAsString

ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(message);

System.out.println(json);

 

역직렬화(deserialize) : readValue

ObjectMapper mapper = new ObjectMapper();
String json = "{\"createdAt\":\"2021-01-12,10:10:10\",\"receiver\":\"박해커\",\"sender\":\"김코딩\",\"message\":\"밥먹을래?\"}";

Map<String, String> deserializedData = mapper.readValue(json, Map.class);
System.out.println(deserializedData);

 

 

  자바스크립트 객체 JSON
따옴표 없이 O 반드시 쌍따옴표
문자열 값 어떠한 형태의 따옴표 O 반드시 쌍따옴표

키와 값 사이, 그리고 키-값 쌍 사이에는 공백이 있어서는 안 된다

 

 


 

StringifyJSON 과제

 

public String stringify(Object data) {

  //입력된 값이 문자열일 경우: "String"
  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[]일 경우: [ , ]
  //Object는 배열을 포함: [1, 2, "String", [null, true]] → 재귀로 타입 분기
  if (data instanceof Object[]) {

    //가장 작은 단위의 경우: 빈 배열을 입력받았을 때
    if (((Object[]) data).length == 0) return "[]";

    //더 작은 단위로 나눌 수 있는 경우
    String result = "";

    for (Object o : (Object[]) data)
      result = result + stringify(o) + ",";

    result = result.substring(0, result.length() - 1);

    return "[" + result + "]";
  }

  //입력된 값이 HashMap일 경우: { : }
  if (data instanceof HashMap) {

    //가장 작은 단위의 경우: 비어 있을 때
    if (((HashMap<?, ?>) data).isEmpty()) return "{}";

    //더 작은 단위로 나눌 수 있는 경우
    String result = "";

    Set<? extends Map.Entry<?, ?>> entrySet = ((HashMap<?, ?>) data).entrySet();
    Iterator<? extends Map.Entry<?, ?>> iterator = entrySet.iterator();

    while (iterator.hasNext()) {
      Map.Entry<?, ?> next = iterator.next();
      result = result + stringify(next.getKey()) + ":" + stringify(next.getValue()) + ",";
    }

    result = result.substring(0, result.length() - 1);

    return "{" + result + "}";
  }

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

'Back-End > Java' 카테고리의 다른 글

Optional이란?  (0) 2022.09.01
StringBuilder의 사용, String으로 변환  (0) 2022.08.13
스레드(Thread)  (0) 2022.07.19
파일 입출력(I/O)  (0) 2022.07.18
스트림  (0) 2022.07.17

댓글