JSON에서 바이너리 데이터를 전송할 때 가장 널리 사용되는 방식은 Base64로 인코딩하는 것입니다. Java는 byte[] 배열을 Base64로 인코딩하고 디코딩할 수 있는 다양한 방법을 제공하며, 그중 하나가 DatatypeConverter입니다.
예를 들어 아래와 같은 JSON 데이터가 있다고 가정해 보겠습니다.
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}
}
JSON을 Base64로 인코딩하기
위 JSON 문자열을 먼저 바이트 배열로 변환한 뒤, DatatypeConverter를 사용해 Base64 문자열로 인코딩합니다.
byte[] jsonBytes = json.getBytes();
String base64Encoded = DatatypeConverter.printBase64Binary(jsonBytes);
- Java에서 JSON을 파싱하는 방법
- Java Map을 JSON으로 변환하는 방법
- Java 객체를 JSON으로 변환하는 방법
Base64로 인코딩된 JSON 디코딩하기
Base64로 인코딩된 JSON 문자열은 parseBase64Binary() 메서드를 통해 원래의 바이트 배열로 되돌릴 수 있습니다.
byte[] base64Decoded = DatatypeConverter.parseBase64Binary(base64Encoded);
String decodedJson = new String(base64Decoded);
전체 예제 코드
아래는 JSON 문자열을 인코딩했다가 다시 디코딩하는 전체 과정을 보여주는 예제입니다.
import javax.xml.bind.DatatypeConverter;
public class JsonEncodeDecode {
public static void main(String[] args) {
String json = "{\"menu\": {\n" +
" \"id\": \"file\",\n" +
" \"value\": \"File\",\n" +
" \"popup\": {\n" +
" \"menuitem\": [\n" +
" {\"value\": \"New\", \"onclick\": \"CreateNewDoc()\"},\n" +
" {\"value\": \"Open\", \"onclick\": \"OpenDoc()\"},\n" +
" {\"value\": \"Close\", \"onclick\": \"CloseDoc()\"}\n" +
" ]\n" +
" }\n" +
"}}";
byte[] bytes = json.getBytes();
String base64Encoded = DatatypeConverter.printBase64Binary(bytes);
System.out.println("인코딩된 JSON:\n");
System.out.println(base64Encoded + "\n");
byte[] base64Decoded = DatatypeConverter.parseBase64Binary(base64Encoded);
System.out.println("디코딩된 JSON:\n");
System.out.println(new String(base64Decoded));
}
}
인코딩 결과 출력
eyJtZW51IjogewogICJpZCI6ICJmaWxlIiwKICAidmFsdW
참고: 가독성을 위해 출력 결과를 일부 생략했습니다. 실제로는 훨씬 긴 문자열이 출력됩니다.
디코딩 결과 출력
디코딩하면 원본 JSON 문자열이 그대로 복원되는 것을 확인할 수 있습니다.
{
"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}
}
최신 Java에서의 대안: java.util.Base64
javax.xml.bind.DatatypeConverter는 JAXB 모듈에 속해 있어 Java 8까지는 기본으로 포함되었지만, Java 11부터는 표준 JDK에서 제외되었습니다. 따라서 최신 프로젝트에서는 Java 8에 도입된 java.util.Base64 클래스를 사용하는 것이 권장됩니다.
import java.util.Base64;
// 인코딩
String base64Encoded = Base64.getEncoder().encodeToString(jsonBytes);
// 디코딩
byte[] base64Decoded = Base64.getDecoder().decode(base64Encoded);
java.util.Base64는 스레드 세이프(thread-safe)하며 추가 의존성 없이 동작하므로, 새로운 코드를 작성할 때는 이 방식을 사용하는 것이 좋습니다.