
JSON: JSON은 JavaScript Object Notation의 줄임말로
Javascript 객체 문법 으로 구조화된 데이터교환형식이다. python, javascript, java 등 대부분의 언어에서 데이터 교환형식으로 쓰이며 객체문법 이외에도 단순 배열, 문자열도 표현 가능하다.
※ JSON은 REST API에서 서버와 클라이언트 간의 데이터 교환 형식으로 많이 사용된다.
예제: JSON 형태의 HTTP 응답
{
"status": "success",
"data": {
"userId": 42,
"username": "springNcode",
"email": "user@example.com"
}
}
※ JSON 데이터는 .json 파일 확장자로 저장된다. -> ex) data.json
▶︎ JSON은 (여러 언어, 플랫폼 등에 대해서) 종속적이지 않고 독립적이다. 특정 언어나 플랫폼이 업데이트되거나 변화한다고 해도 데이터 형식인 JSON에는 영향이 가지 않는다.
JSON 데이터는 키(key)와 값(value)으로 이루어진 속성(property) 쌍의 집합이다.
JSON 객체는 중괄호 {} 로 감싸며, 배열(array) 은 대괄호 [] 를 사용한다.
{
"name": "Alice",
"age": 25,
"isStudent": false,
"skills": ["Java", "Python", "JavaScript"],
"address": {
"city": "Seoul",
"zipCode": "12345"
}
}
JSON에서는 6가지 데이터 유형을 지원한다.

이 JSON 파일을 언어에서 바로 쓸 수는 없다. 이 JSON을 언어에서 사용하기 위해서는 객체, 해시테이블, 딕셔너리 등으로 변환하는 과정이 필요하고 데이터로써 전송하기 위해서는 객체를 JSON으로 변환하는 별도의 과정들이 필요한데 이 때 사용되는 방법이 직렬화와 역직렬화이다.

직렬화: 외부의 시스템에서도 사용할 수 있도록 바이트(이진 데이터) 형태로 데이터를 변환하는 기술이다.
객체 → 바이트(파일, JSON, XML, 문자열 등) 형태로 변환
<Java에서 직렬화 예제 (Object → JSON)>
import com.fasterxml.jackson.databind.ObjectMapper; // JSON 직렬화를 위한 Jackson 라이브러리 import
import java.io.*; // 파일 및 객체 입출력을 위한 Java 기본 패키지 import
// User 클래스 정의, 직렬화를 위해 Serializable 인터페이스 구현
class User implements Serializable {
private static final long serialVersionUID = 1L; // 직렬화된 객체의 버전 관리를 위한 UID
public String name; // 사용자 이름 필드
public int age; // 사용자 나이 필드
// 생성자 정의
public User(String name, int age) {
this.name = name;
this.age = age;
}
}
public class SerializationExample {
public static void main(String[] args) throws Exception {
// User 객체 생성
User user = new User("Alice", 25);
// JSON 직렬화 (객체 → JSON 문자열)
ObjectMapper objectMapper = new ObjectMapper(); // Jackson의 ObjectMapper 인스턴스 생성
String jsonString = objectMapper.writeValueAsString(user); // User 객체를 JSON 문자열로 변환
System.out.println("직렬화된 JSON: " + jsonString); // JSON 문자열 출력
// 바이너리 직렬화 (객체 → 파일)
FileOutputStream fileOut = new FileOutputStream("user.ser"); // user.ser 파일 생성
ObjectOutputStream out = new ObjectOutputStream(fileOut); // 객체를 파일에 저장할 스트림 생성
out.writeObject(user); // User 객체를 직렬화하여 파일에 저장
out.close(); // 스트림 닫기
fileOut.close(); // 파일 스트림 닫기
System.out.println("객체가 user.ser 파일에 저장됨"); // 저장 완료 메시지 출력
}
}
[출력 예시]
직렬화된 JSON: {"name":"Alice","age":25}
객체가 user.ser 파일에 저장됨
객체가 JSON 또는 파일(user.ser)로 저장된다.
직렬화: 해당 시스템에서 사용할 수 있도록 바이트(이진 데이터) 데이터를 알맞은 데이터(객체, 해시테이블, 문자열 등)로 변환하는 기술이다.
바이트 데이터(JSON, XML 등) → 객체로 변환하는 과정
<Java에서 역직렬화 예제 (JSON → Object)>
public class DeserializationExample {
public static void main(String[] args) throws Exception {
// JSON 역직렬화 (JSON 문자열 → 객체)
ObjectMapper objectMapper = new ObjectMapper(); // Jackson 라이브러리의 ObjectMapper 객체 생성
String jsonString = "{\"name\":\"Alice\",\"age\":25}"; // JSON 문자열 예시
// ObjectMapper를 사용하여 JSON 문자열을 User 객체로 역직렬화
User user = objectMapper.readValue(jsonString, User.class);
// 역직렬화된 객체의 값 출력
System.out.println("역직렬화된 객체: " + user.name + ", " + user.age);
// 바이너리 역직렬화 (파일 → 객체)
// "user.ser" 파일을 읽기 위한 입력 스트림 생성
FileInputStream fileIn = new FileInputStream("user.ser");
// 파일 입력 스트림을 사용하여 객체를 읽을 수 있는 ObjectInputStream 생성
ObjectInputStream in = new ObjectInputStream(fileIn);
// ObjectInputStream을 사용하여 파일에서 User 객체를 역직렬화
User deserializedUser = (User) in.readObject();
// 스트림을 닫기 전에 자원 해제
in.close();
fileIn.close();
// 파일에서 로드된 객체의 값 출력
System.out.println("파일에서 로드된 객체: " + deserializedUser.name + ", " + deserializedUser.age);
}
}
[출력 예시]
역직렬화된 객체: Alice, 25
파일에서 로드된 객체: Alice, 25
JSON 문자열과 파일에서 객체로 변환되었다.