Java에서 Jackson 라이브러리를 사용해 객체를 JSON으로 직렬화할 때, 기본적으로 속성 순서는 클래스 내부 구조에 따라 결정됩니다. 하지만 @JsonPropertyOrder 어노테이션을 사용하면 원하는 순서대로 속성을 직렬화할 수 있습니다.
@JsonPropertyOrder란?
@JsonPropertyOrder는 클래스 레벨(class-level)에서 사용되는 어노테이션입니다. 이 어노테이션은 필드 이름들의 목록을 속성 값으로 받으며, 객체가 JSON 문자열로 직렬화될 때 각 필드가 출력되는 순서를 정의합니다.
어노테이션 선언에 포함된 속성들은 지정된 순서대로 먼저 직렬화되며, 정의에 포함되지 않은 나머지 속성들은 그 뒤에 이어서 출력됩니다.
문법(Syntax)
public @interface JsonPropertyOrder
사용 예제
다음 예제는 Employee 클래스에 @JsonPropertyOrder 어노테이션을 적용하여 firstName, lastName, technologies, empId 순서대로 JSON이 출력되도록 설정한 코드입니다.
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import java.util.*;
import java.io.*;
public class JsonPropertyOrderTest {
public static void main(String args[]) throws JsonGenerationException,
JsonMappingException, IOException {
Employee emp = new Employee();
emp.setFirstName("Adithya");
emp.setEmpId(125);
emp.setLastName("Jai");
emp.getTechnologies().add("Java");
emp.getTechnologies().add("Scala");
emp.getTechnologies().add("Python");
ObjectMapper mapper = new ObjectMapper();
mapper.writerWithDefaultPrettyPrinter().writeValue(System.out, emp);
}
}
// Employee 클래스
@JsonPropertyOrder({
"firstName",
"lastName",
"technologies",
"empId"
})
class Employee {
private int empId;
private String firstName;
private String lastName;
private List<String> technologies = new ArrayList<>();
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public List<String> getTechnologies() {
return technologies;
}
public void setTechnologies(List<String> technologies) {
this.technologies = technologies;
}
}실행 결과
위 코드를 실행하면 어노테이션에 정의한 순서 그대로 JSON이 생성되는 것을 확인할 수 있습니다.
{
"firstName" : "Adithya",
"lastName" : "Jai",
"technologies" : [ "Java", "Scala", "Python" ],
"empId" : 125
}추가 팁: 알파벳순 정렬
필드 순서를 일일이 지정하지 않고 알파벳 순서로 정렬하고 싶다면, @JsonPropertyOrder의 alphabetic 속성을 true로 설정하면 됩니다.
@JsonPropertyOrder(alphabetic = true)
class Employee { ... }이 경우 모든 속성이 이름 기준 오름차순으로 자동 정렬되어 출력됩니다. API 응답의 필드 순서를 일관되게 유지해야 하는 경우 @JsonPropertyOrder는 매우 유용한 기능입니다.