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 |
댓글