Jackson - 資料繫結



資料繫結 API 用於使用屬性訪問器或註釋將 JSON 轉換為 POJO(普通舊 Java 物件)或從 POJO 轉換回來。它分為兩種型別。

  • 簡單資料繫結 - 將 JSON 轉換為 Java Map、列表、字串、數字、布林值和 null 物件或從其轉換回來。

  • 完整資料繫結 - 將 JSON 轉換為任何 JAVA 型別或從其轉換回來。

ObjectMapper 對兩種型別的資料繫結進行 JSON 的讀/寫。資料繫結是最便捷的方式,類似用於 XML 的 JAXB 解析器。

簡單資料繫結

簡單資料繫結是指 JSON 到 JAVA 核心資料型別的對映。下表說明了 JSON 型別與 Java 型別之間的關係。

序號JSON 型別Java 型別
1物件LinkedHashMap<String,Object>
2陣列ArrayList<Object>
3字串String
4整數Integer、Long 或 BigInteger
5小數Double / BigDecimal
6true | falseBoolean
7nullnull

讓我們看看簡單資料繫結的實際應用。此處,我們將直接將 JAVA 基本型別對映到 JSON,反之亦然。

C:\>Jackson_WORKSPACE 中建立一個名為 JacksonTester 的 java 類檔案。

檔案:JacksonTester.java

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTester {
   public static void main(String args[]){
      JacksonTester tester = new JacksonTester();
         try {
            ObjectMapper mapper = new ObjectMapper();

            Map<String,Object> studentDataMap = new HashMap<String,Object>(); 
            int[] marks = {1,2,3};

            Student student = new Student();
            student.setAge(10);
            student.setName("Mahesh");
            // JAVA Object
            studentDataMap.put("student", student);
            // JAVA String
            studentDataMap.put("name", "Mahesh Kumar");   		
            // JAVA Boolean
            studentDataMap.put("verified", Boolean.FALSE);
            // Array
            studentDataMap.put("marks", marks);

            mapper.writeValue(new File("student.json"), studentDataMap);
            //result student.json
			//{ 
            //   "student":{"name":"Mahesh","age":10},
            //   "marks":[1,2,3],
            //   "verified":false,
            //   "name":"Mahesh Kumar"
            //}
            studentDataMap = mapper.readValue(new File("student.json"), Map.class);

            System.out.println(studentDataMap.get("student"));
            System.out.println(studentDataMap.get("name"));
            System.out.println(studentDataMap.get("verified"));
            System.out.println(studentDataMap.get("marks"));
      } catch (JsonParseException e) {
         e.printStackTrace();
      } catch (JsonMappingException e) {
         e.printStackTrace();
      } catch (IOException e) {
            e.printStackTrace();
      }
   }
}

class Student {
   private String name;
   private int age;
   public Student(){}
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
   public int getAge() {
      return age;
   }
   public void setAge(int age) {
      this.age = age;
   }
   public String toString(){
      return "Student [ name: "+name+", age: "+ age+ " ]";
   }	
}

驗證結果

使用 javac 編譯器編譯類,如下所示

C:\Jackson_WORKSPACE>javac JacksonTester.java

現在執行 jacksonTester 檢視結果

C:\Jackson_WORKSPACE>java JacksonTester

驗證輸出

{name=Mahesh, age=10}
Mahesh Kumar
false
[1, 2, 3]

完整資料繫結

使用泛型進行資料繫結

廣告
© . All rights reserved.