คำอธิบายประกอบ @JsonRootName ใช้สำหรับ wrap object ให้มี top-level element ระหว่าง serialization เราสามารถส่งชื่อเป็นพารามิเตอร์ให้ @JsonRootName ได้ เราสามารถใช้ฟีเจอร์ "WRAP_ROOT_VALUE" ของ SerializationFeature enum เพื่อเปิดใช้งานการ wrap root value ภายใน JSON object เดียวที่ key คือ root name
ตัวอย่างการใช้งาน
import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.SerializationFeature;
public class JsonRootNameAnnotationTest {
public static void main(String args[]) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.enable(SerializationFeature.WRAP_ROOT_VALUE)
.writeValueAsString(new Employee());
System.out.println(jsonString);
}
}
@JsonRootName(value = "user")
class Employee {
public int empId = 125;
public String empName = "Raja Ramesh";
}
ผลลัพธ์ (Output)
{"user":{"empId":125,"empName":"Raja Ramesh"}}
คำอธิบาย
โดยปกติ Jackson จะ serialize object โดยตรง:
{"empId":125,"empName":"Raja Ramesh"}
แต่เมื่อเปิด SerializationFeature.WRAP_ROOT_VALUE และมี @JsonRootName("user") JSON จะถูก wrap ด้วย key "user" กลายเป็น object ที่มี property เดียวคือ "user" ซึ่งค่าคือ object เดิม
กรณีการใช้งาน (Use Cases)
- XML compatibility - XML ต้องมี root element เดียว JSON ปกติไม่มี
- API specification - บาง API กำหนดให้ต้องมี root wrapper
- Multiple root types - แยกประเภท object ด้วย root name
- Legacy system integration - ระบบเก่าคาดหวัง root wrapper
ตัวเลือกเพิ่มเติม
สามารถกำหนด namespace ได้ด้วย:
@JsonRootName(value = "user", namespace = "https://example.com/user")
สรุป
@JsonRootName ร่วมกับ WRAP_ROOT_VALUE ให้วิธีง่ายๆ ในการเพิ่ม root wrapper ให้ JSON output เหมาะสำหรับความเข้ากันได้กับ XML หรือ API ที่กำหนด root element