Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

ความสำคัญของ @JsonRootName annotation ใน Jackson (Java)

คำอธิบายประกอบ @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