본문 바로가기
Back-End/Java

[Java] StringifyJSON

by 달의 조각 2022. 7. 22.

 

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";
}

댓글