คลาส ObjectMapper ให้ functionality สำหรับแปลงระหว่าง Java objects และ matching JSON constructs เราสามารถ map JSON data ที่ represented โดย Object Model (tree-like data structure) ไปยัง Java object ได้ โดยขั้นตอนแรก อ่าน JSON data เข้า JsonNode object แล้ว map ไป instance อื่นด้วยเมธอด treeToValue() ของ ObjectMapper
Syntax
public <T> T treeToValue(TreeNode n, Class<T> valueType) throws JsonProcessingException
ตัวอย่างการใช้งาน
import java.io.*;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
public class JsonTreeModelDemo {
public static void main(String[] args) throws JsonProcessingException, IOException {
String jsonString = "{\"id\":\"102\", \"name\":\"Raja Ramesh\", \"address\":[{\"area\":\"Madhapur\", \"city\":\"Hyderabad\"}]}";
ObjectMapper objectMapper = new ObjectMapper();
JsonNode jsonNode = objectMapper.readTree(jsonString);
User user = objectMapper.treeToValue(jsonNode, User.class);
System.out.println(user);
}
}
// User class
class User {
private int id;
private String name;
private Address[] address;
// getters/setters...
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Address[] getAddress() { return address; }
public void setAddress(Address[] address) { this.address = address; }
@Override
public String toString() {
StringBuilder sb = new StringBuilder("{");
sb.append(id).append(",").append(name).append(",");
for (Address address1 : address) {
sb.append(address1).append(",");
}
sb.append("}");
return sb.toString();
}
}
// Address class
class Address {
private String area;
private String city;
// getters/setters...
public String getArea() { return area; }
public void setArea(String area) { this.area = area; }
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
@Override
public String toString() {
return "{" + area + "," + city + "}";
}
}
ผลลัพธ์ (Output)
{102,Raja Ramesh,{Madhapur,Hyderabad},}
คำอธิบายขั้นตอน (Tree Model Approach)
objectMapper.readTree(jsonString)- Parse JSON string เป็น JsonNode tree (immutable)objectMapper.treeToValue(jsonNode, User.class)- Convert JsonNode tree เป็น POJO
JsonNode Operations ที่มีประโยชน์
jsonNode.get("fieldName")- เข้าถึง child nodejsonNode.path("fieldName")- เข้าถึง child node (คืน MissingNode ถ้าไม่มี ไม่โยน exception)jsonNode.asText(),asInt(),asLong(), etc. - แปลงค่าjsonNode.elements()- Iterator สำหรับ array elementsjsonNode.fields()- Iterator สำหรับ object fields
เปรียบเทียบ 3 Approaches ของ Jackson
| Approach | คำอธิบาย | เหมาะสำหรับ |
|---|---|---|
| Data Binding (readValue) | JSON → POJO โดยตรง | กรณีทั่วไป, POJO structure ตรงกับ JSON |
| Tree Model (readTree → treeToValue) | JSON → JsonNode tree → POJO | ต้อง inspect/transform JSON ก่อน map, dynamic structure |
| Streaming API (JsonParser) | Event-based parsing | ข้อมูลใหญ่มาก, memory constrained, performance critical |
สรุป
Tree Model (JsonNode) ให้ความยืดหยุ่นในการ inspect และ manipulate JSON ก่อน map เป็น POJO เหมาะสำหรับ dynamic JSON structures หรือเมื่อต้องการ validation/transformation ก่อน binding