Back-End/Java

[Java] StringifyJSON

달의 조각 2022. 7. 22. 13:59

 

JSON

JavaScript Object Notation

 

  JSON이란, 서로 다른 프로그램 사이의 데이터 교환을 위해 사용되는 데이터 타입으로, 객체 형태의 포맷이다. 자바스크립트을 포함한 많은 언어에서 범용적으로 사용하는 대중적인 포맷이라고 할 수 있다.

 

데이터 전송이 가능한 조건 (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";
}