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

เมื่อไหร่ควรใช้ @JsonValue annotation ใน Jackson (Java)

คำอธิบายประกอบ @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 เหมาะสำหรับกรณีพิเศษที่ต้องการรูปแบบเฉพาะเจาะจง