본문 바로가기
부트캠프/백

11.18 JSON(미완성)

by 티코딩 2022. 11. 19.

ㅇ JSON

JavaScript Object Notation의 약자. 데이터 교환을 위해 만들어진 객체 형태의 포맷이다.

자바에서 자바스크립트간, 파이썬에서 자바간, 다양하게 데이터를 교환할 수 있게 해준다.

저번에 읽은 책에서 나와서 대충 개념은 알았지만, 써보는 것은 처음이었다.

 

Map<String,String> message = new HashMap<>(){{
    put("a","b");
    put("c","d");
    put("e","f");
}};

이런 해시맵의 데이터를 어떻게 전송할까?

전송조건은 수신자 발신자는 같은 프로그램을 사용하거나, 문자열처럼 범용성있게 읽기 가능해야한다는 것이다.

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

이렇게 jackson라이브러리에서 제공하는 ObjectMapper클래스를 사용하면, JSON으로 변환된 문자열이된다.

이 과정을 직렬화라고 함.

이걸 받은 수신자는 다시 객체로 변환한다.

ObjectMapper mapper = new ObjectMapper();
String json = "{. . .결과값. . .}"
Map<String, String> deserializedData = mapper.readValue(json, Map.class);
    System.out.println(deserializedData);

JSON의 readValue() 메서드를 사용한다. 이 과정을 역직렬화 라고함.

 

ㅇ JSON을 통한 타입 변환 (String으로)

JSON에대해 아주 간단히 배우고 실습을 진행했는데 따라가기 너무너무힘들었다. 하지만 페어분은 끝까지 열심히하셔서 해냈다.

존경스럽다.

다양한 타입의 입력된 값을 String으로 변환시키는 메서드를 완성시키는 실습을 진행했다.

문자열을 입력받은경우

//입력된 값이 문자열일 경우
if (data instanceof String) {
  return "\"" + data.toString() + "\"";
}

Integer인 경우

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

저런식으로 빈문자열을 더해주면 자동으로 String타입으로 변환된다는것을 오늘 알았다.

boolean인 경우

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

내가 한 방법이 간단하지만, if문을 사용하는 방법도 참신했다.

Object[]인 경우

//입력된 값이 Object[]일 경우
  Object[] arr = (Object[])data;
  for(int idx = 0; idx < arr.length; idx++) {
  arr[idx] = stringify(arr[idx]);
  }
  return Arrays.toString(arr).replaceAll(" ", "");
}

여기서부터 정말 어려웠다. 코드 한줄한줄 봐야할것같다.

재귀를 이용하는것이 아직은 익숙치 않아서 계속 봐야한다.

HashMap인 경우

//입력된 값이 HashMap일 경우
ObjectMapper mapper = new ObjectMapper();
  HashMap<Object, Object> map = (HashMap<Object, Object>) data;
  HashMap<Object, Object> result = new LinkedHashMap<>(); 순서보장해주는 해시맵
  for(Map.Entry<Object, Object> entry : map.entrySet()) {
  String key = stringify(entry.getkey());
  String value = stringify(entry.getValue());
  result.put(key, value);
  }
  return result.toString().replaceAll("=",":").replaceAll(" ", "");
}

이건 정말 천천~~히 봐야할것같다. 저번 섹션에서 배운 해시맵이지만 아직은 익숙치가 않다. LinkedHashMap을 사용하면

순서를 보장하지 않는 HashMap과는 달리 입력한 순서를 보장해준다고 한다. 

LinkedHashMap<Object, Object>result = new LinkedHashMap<>();

으로 작성하지 않은 이유는 상위클래스이기 때문이다.

배열과 해시맵을 바꾸는 코드는 이해해가며 추후에 수정하겠다.

'부트캠프 > ' 카테고리의 다른 글

11.22 자료구조-Tree, 그래프, BinarySearchTree(BST), BFS/DFS  (0) 2022.11.25
11.21 자료구조 - Stack, Queue  (0) 2022.11.25
11.17 재귀  (0) 2022.11.18
11.15 Thread2  (0) 2022.11.16
11.15 스레드1, JVM  (0) 2022.11.16