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

วิธี Map JSON Data ด้วย Jackson Object Model ใน Java

คลาส 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)

  1. objectMapper.readTree(jsonString) - Parse JSON string เป็น JsonNode tree (immutable)
  2. objectMapper.treeToValue(jsonNode, User.class) - Convert JsonNode tree เป็น POJO

JsonNode Operations ที่มีประโยชน์

  • jsonNode.get("fieldName") - เข้าถึง child node
  • jsonNode.path("fieldName") - เข้าถึง child node (คืน MissingNode ถ้าไม่มี ไม่โยน exception)
  • jsonNode.asText(), asInt(), asLong(), etc. - แปลงค่า
  • jsonNode.elements() - Iterator สำหรับ array elements
  • jsonNode.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