คำอธิบายประกอบ @JsonValue มีประโยชน์ที่ระดับเมธอด ใช้สำหรับสร้าง JSON string จาก Java object หากต้องการพิมพ์ serialized object ปกติจะ override เมธอด toString() แต่ด้วย @JsonValue เราสามารถกำหนดวิธีการที่ Java object จะถูก serialize ได้
Syntax
@Target(value={ANNOTATION_TYPE, METHOD, FIELD})
@Retention(value=RUNTIME)
public @interface JsonValue
ตัวอย่างการใช้งาน
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonValue;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
public class JsonValueAnnotationTest {
public static void main(String args[]) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String jsonString = mapper.writeValueAsString(new Student());
System.out.println(jsonString);
}
}
// Student class
class Student {
@JsonProperty
private int studentId = 115;
@JsonProperty
private String studentName = "Sai Adithya";
@JsonValue
public String toJson() {
return this.studentName + "," + this.studentId + "," + this.toString();
}
@Override
public String toString() {
return "Student[" + "studentId = " + studentId + ", studentName = " + studentName + ']';
}
}
ผลลัพธ์ (Output)
"Sai Adithya,115,Student[studentId = 115, studentName = Sai Adithya]"
คำอธิบาย
โดยปกติ Jackson จะ serialize object เป็น JSON object แบบมีฟิลด์แยกกัน แต่ @JsonValue บอก Jackson ให้ใช้ค่าที่คืนจากเมธอดที่ annotate แทน ทำให้ได้ JSON string เดียวแทนที่จะเป็น JSON object
กรณีการใช้งาน (Use Cases)
- เมื่อต้องการ serialize object เป็นค่าเดี่ยว (single value) เช่น string หรือ number
- เมื่อต้องการควบคุมรูปแบบการ serialize แบบกำหนดเอง (custom format)
- สำหรับ enum ที่ต้องการค่าเฉพาะเมื่อ serialize
- เมื่อต้องการความเข้ากันได้กับระบบเก่า (legacy systems) ที่คาดหวังรูปแบบเฉพาะ
ข้อควรระวัง
- @JsonValue ควรใช้กับเมธอดที่คืนค่า type เดียวเสมอ
- ไม่ควรใช้กับเมธอดที่มี side effects
- deserialization จะต้องใช้ @JsonCreator หรือ custom deserializer คู่กัน
สรุป
@JsonValue ให้ความยืดหยุ่นในการควบคุมรูปแบบ JSON output ของ object เหมาะสำหรับกรณีพิเศษที่ต้องการรูปแบบเฉพาะเจาะจง