JSONObject는 순서가 없는 이름/값(name/value) 쌍의 집합이며, Map은 키(key)를 값(value)에 매핑하는 객체입니다. Map에는 중복된 키를 포함할 수 없으며, 각 키는 최대 하나의 값에만 매핑될 수 있습니다.
Map 객체를 JSON 형식으로 직렬화(serialization)하거나 역직렬화(deserialization)하려면 JSON-lib 라이브러리가 필요합니다. 기본적인 절차는 다음과 같습니다.
- 먼저 POJO 클래스를 생성합니다.
- POJO 인스턴스를 Map 클래스의 put() 메서드에 인수로 전달하여 저장합니다.
- 마지막으로 해당 Map 인스턴스를 JSONObject의 accumulateAll() 메서드에 추가하면 Map의 모든 키-값 쌍이 JSON 객체로 병합됩니다.
메서드 문법
public void accumulateAll(Map map)
참고: JSON-lib 라이브러리를 프로젝트에서 사용하려면 다음과 같이 Maven 의존성을 추가해야 합니다.
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
아래 예제에서는 Map을 JSON 객체로 변환하는 전체 과정을 확인할 수 있습니다.
예제
import java.util.*;
import net.sf.json.JSONObject;
public class ConvertMapToJSONObjectTest {
public static void main(String[] args)throws Exception {
JSONObject jsonObject = new JSONObject();
Map<Integer, Employee> employees = new HashMap<Integer, Employee>();
employees.put(1, new Employee("Adithya", "Jai", 30));
employees.put(2, new Employee("Vamsi", "Krishna", 28));
employees.put(3, new Employee("Chaitanya", "Sai", 30));
jsonObject.accumulateAll(employees);
System.out.println(jsonObject.toString(3)); // pretty print JSON
}
public static class Employee {
private String firstName, lastName;
private int age;
public Employee(String firstName, String lastName, int age) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
}
}
실행 결과
{
"1": {
"firstName": "Adithya",
"lastName": "Jai",
"age": 30
},
"2": {
"firstName": "Vamsi",
"lastName": "Krishna",
"age": 28
},
"3": {
"firstName": "Chaitanya",
"lastName": "Sai",
"age": 30
}
}
위 출력 결과에서 볼 수 있듯이, Map의 각 키(Integer 값 1, 2, 3)는 JSON 객체 내에서 문자열 키로 변환되며, 각 Employee POJO 객체는 이름(first Name), 성(lastName), 나이(age) 속성을 가진 중첩 JSON 객체로 직렬화됩니다. 또한 toString(3) 메서드에 들여쓰기 수준을 지정하면 사람이 읽기 쉬운 형태(pretty print)로 JSON을 출력할 수 있습니다.