Gson - คู่มือฉบับย่อ

Google Gson เป็นไลบรารีที่ใช้ Java อย่างง่ายเพื่อทำให้ออบเจ็กต์ Java เป็นอนุกรมเป็น JSON และในทางกลับกัน เป็นไลบรารีโอเพนซอร์สที่พัฒนาโดย Google

ประเด็นต่อไปนี้เน้นเหตุผลที่คุณควรใช้ห้องสมุดนี้ -

  • Standardized - Gson เป็นไลบรารีมาตรฐานที่ Google จัดการ

  • Efficient - เป็นส่วนขยายที่เชื่อถือได้รวดเร็วและมีประสิทธิภาพสำหรับไลบรารีมาตรฐาน Java

  • Optimized - ห้องสมุดได้รับการปรับให้เหมาะสมที่สุด

  • Support Generics - ให้การสนับสนุนอย่างกว้างขวางสำหรับยาชื่อสามัญ

  • Supports complex inner classes - รองรับวัตถุที่ซับซ้อนพร้อมลำดับชั้นการสืบทอดแบบลึก

คุณสมบัติของ Gson

นี่คือรายการคุณสมบัติที่โดดเด่นที่สุดของ Gson -

  • Easy to use - Gson API ให้ส่วนหน้าระดับสูงเพื่อลดความซับซ้อนของกรณีการใช้งานที่ใช้กันทั่วไป

  • No need to create mapping - Gson API จัดทำแผนที่เริ่มต้นสำหรับวัตถุส่วนใหญ่ที่จะทำให้เป็นอนุกรม

  • Performance- Gson ค่อนข้างเร็วและมีหน่วยความจำต่ำ เหมาะสำหรับกราฟหรือระบบวัตถุขนาดใหญ่

  • Clean JSON - Gson สร้างผลลัพธ์ JSON ที่สะอาดและกะทัดรัดซึ่งอ่านง่าย

  • No Dependency - ห้องสมุด Gson ไม่ต้องการห้องสมุดอื่นใดนอกจาก JDK

  • Open Source- ห้องสมุด Gson เป็นโอเพ่นซอร์ส สามารถใช้ได้อย่างอิสระ

สามวิธีในการประมวลผล JSON

Gson มีวิธีอื่นในการประมวลผล JSON สามวิธี -

Streaming API

มันอ่านและเขียนเนื้อหา JSON เป็นเหตุการณ์ที่ไม่ต่อเนื่อง JsonReader และ JsonWriter อ่าน / เขียนข้อมูลเป็นโทเค็นเรียกว่า JsonToken.

เป็นแนวทางที่ทรงพลังที่สุดในสามวิธีในการประมวลผล JSON มีค่าใช้จ่ายต่ำสุดและค่อนข้างรวดเร็วในการอ่าน / เขียน คล้ายกับ Stax parser สำหรับ XML

โมเดลต้นไม้

เตรียมการแสดงแผนผังในหน่วยความจำของเอกสาร JSON สร้างต้นไม้ของโหนด JsonObject เป็นแนวทางที่ยืดหยุ่นและคล้ายคลึงกับตัวแยกวิเคราะห์ DOM สำหรับ XML

การผูกข้อมูล

มันแปลง JSON เป็นและจาก POJO (Plain Old Java Object) โดยใช้ตัวเข้าถึงคุณสมบัติ Gson อ่าน / เขียน JSON โดยใช้อะแด็ปเตอร์ชนิดข้อมูล คล้ายกับตัวแยกวิเคราะห์ JAXB สำหรับ XML

การตั้งค่าสภาพแวดล้อมท้องถิ่น

หากคุณยังคงต้องการตั้งค่าสภาพแวดล้อมเฉพาะสำหรับภาษาโปรแกรม Java ส่วนนี้จะแนะนำวิธีดาวน์โหลดและตั้งค่า Java บนเครื่องของคุณ โปรดทำตามขั้นตอนที่ระบุด้านล่างเพื่อตั้งค่าสภาพแวดล้อม

Java SE เป็นอิสระที่มีอยู่จากการเชื่อมโยงดาวน์โหลด Java คุณจึงดาวน์โหลดเวอร์ชันที่อิงตามระบบปฏิบัติการของคุณ

ทำตามคำแนะนำเพื่อดาวน์โหลด Java และเรียกใช้ไฟล์ .exeเพื่อติดตั้ง Java บนเครื่องของคุณ เมื่อคุณติดตั้ง Java บนเครื่องของคุณแล้วคุณจะต้องตั้งค่าตัวแปรสภาพแวดล้อมให้ชี้ไปที่ไดเร็กทอรีการติดตั้งที่ถูกต้อง

การตั้งค่า Path ใน Windows 2000 / XP

สมมติว่าคุณติดตั้ง Java ในไดเร็กทอรีc: \ Program Files \ java \ jdk -

  • คลิกขวาที่ 'My Computer' และเลือก 'Properties'

  • คลิกที่ปุ่ม "ตัวแปรสภาพแวดล้อม" ใต้แท็บ "ขั้นสูง"

  • จากนั้นแก้ไขตัวแปร 'Path' เพื่อให้มีพา ธ ไปยังไฟล์ปฏิบัติการ Java ตัวอย่างเช่นหากเส้นทางถูกตั้งค่าเป็น 'C: \ WINDOWS \ SYSTEM32' ให้เปลี่ยนเส้นทางของคุณเป็นอ่าน 'C: \ WINDOWS \ SYSTEM32; c: \ Program Files \ java \ jdk \ bin'

การตั้งค่าเส้นทางใน Windows 95/98 / ME

สมมติว่าคุณติดตั้ง Java ในไดเร็กทอรีc: \ Program Files \ java \ jdk -

  • แก้ไขไฟล์ 'C: \ autoexec.bat' และเพิ่มบรรทัดต่อไปนี้ที่ส่วนท้าย: 'SET PATH =% PATH%; C: \ Program Files \ java \ jdk \ bin'

การตั้งค่า Path สำหรับ Linux, UNIX, Solaris, FreeBSD

ตัวแปรสภาพแวดล้อม PATHควรกำหนดให้ชี้ไปที่ตำแหน่งที่ติดตั้งไบนารี Java อ้างถึงเอกสารประกอบเชลล์ของคุณหากคุณมีปัญหาในการดำเนินการนี้

ตัวอย่างเช่นหากคุณใช้ bash เป็นเชลล์คุณจะต้องเพิ่มบรรทัดต่อไปนี้ต่อท้าย '.bashrc: export PATH = / path / to / java: $ PATH'

บรรณาธิการ Java ยอดนิยม

ในการเขียนโปรแกรม Java ของคุณคุณจะต้องมีโปรแกรมแก้ไขข้อความ มี IDE ที่ซับซ้อนอยู่ไม่น้อยในตลาด แต่ในตอนนี้คุณสามารถพิจารณาข้อใดข้อหนึ่งต่อไปนี้ -

  • Notepad - ใน Windows คุณสามารถใช้โปรแกรมแก้ไขข้อความธรรมดา ๆ เช่น Notepad (แนะนำสำหรับบทช่วยสอนนี้) หรือ TextPad

  • Netbeans - เป็น Java IDE ที่เป็นโอเพ่นซอร์สและฟรีซึ่งสามารถดาวน์โหลดได้จาก https://netbeans.org/index.html.

  • Eclipse - นอกจากนี้ยังเป็น Java IDE ที่พัฒนาโดยชุมชนโอเพนซอร์ส Eclipse และสามารถดาวน์โหลดได้จาก https://www.eclipse.org/.

ดาวน์โหลด Gson Archive

ดาวน์โหลดไฟล์ Gson jar เวอร์ชันล่าสุดจาก gson-2.3.1.jar. ในขณะที่เขียนบทช่วยสอนนี้เราดาวน์โหลด gson-2.3.1.jar และคัดลอกลงในโฟลเดอร์ C: \> gson

ระบบปฏิบัติการ ชื่อที่เก็บถาวร
Windows gson-2.3.1.jar
ลินุกซ์ gson-2.3.1.jar
Mac gson-2.3.1.jar

ตั้งค่า Gson Environment

ตั้งค่า GSON_HOME ตัวแปรสภาพแวดล้อมเพื่อชี้ไปยังตำแหน่งไดเร็กทอรีฐานที่เก็บ Gson jar ไว้ในเครื่องของคุณ

ระบบปฏิบัติการ เอาต์พุต
Windows ตั้งค่าตัวแปรสภาพแวดล้อม GSON_HOME เป็น C: \ gson
ลินุกซ์ ส่งออก GSON_HOME = / usr / local / gson
Mac ส่งออก GSON_HOME = / Library / gson

ตั้งค่าตัวแปร CLASSPATH

ตั้งค่า CLASSPATH ตัวแปรสภาพแวดล้อมเพื่อชี้ไปที่ตำแหน่งโถ Gson

ระบบปฏิบัติการ เอาต์พุต
Windows ตั้งค่าตัวแปรสภาพแวดล้อม CLASSPATH เป็น% CLASSPATH%;% GSON_HOME% \ gson-2.3.1.jar; .;
ลินุกซ์ ส่งออก CLASSPATH = $ CLASSPATH: $ GSON_HOME / gson-2.3.1.jar:.
Mac ส่งออก CLASSPATH = $ CLASSPATH: $ GSON_HOME / gson-2.3.1.jar:.

ก่อนที่จะลงรายละเอียดของไลบรารี Google Gson เรามาดูการใช้งานแอปพลิเคชันกันก่อน ในตัวอย่างนี้เราได้สร้างไฟล์Studentชั้นเรียน เราจะสร้างสตริง JSON พร้อมรายละเอียดของนักเรียนและกำหนดค่าเริ่มต้นเป็นstudent แล้วทำให้เป็นอนุกรมกับสตริง JSON

ตัวอย่าง

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder;  

public class GsonTester { 
   public static void main(String[] args) { 
      String jsonString = "{\"name\":\"Mahesh\", \"age\":21}"; 
      
      GsonBuilder builder = new GsonBuilder(); 
      builder.setPrettyPrinting(); 
      
      Gson gson = builder.create(); 
      Student student = gson.fromJson(jsonString, Student.class); 
      System.out.println(student);    
      
      jsonString = gson.toJson(student); 
      System.out.println(jsonString);  
   } 
} 

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:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

Student [ name: Mahesh, age: 21 ] 
{ 
   "name" : "Mahesh", 
   "age" : 21 
}

ขั้นตอนในการจำ

ต่อไปนี้เป็นขั้นตอนสำคัญที่จะต้องพิจารณาที่นี่

ขั้นตอนที่ 1 - สร้างวัตถุ Gson โดยใช้ GsonBuilder

สร้างวัตถุ Gson เป็นวัตถุที่ใช้ซ้ำได้

GsonBuilder builder = new GsonBuilder(); 
builder.setPrettyPrinting(); 
Gson gson = builder.create();

ขั้นตอนที่ 2 - ยกเลิกการกำหนดค่า JSON เป็น Object

ใช้เมธอด fromJson () เพื่อรับ Object จาก JSON ส่งสตริง Json / ต้นทางของสตริง Json และชนิดอ็อบเจ็กต์เป็นพารามิเตอร์

//Object to JSON Conversion 
Student student = gson.fromJson(jsonString, Student.class);

ขั้นตอนที่ 3 - Serialize Object เป็น JSON

ใช้เมธอด toJson () เพื่อรับการแสดงสตริง JSON ของอ็อบเจ็กต์

//Object to JSON Conversion   
jsonString = gson.toJson(student);

Gson เป็นนักแสดงหลักของห้องสมุด Google Gson มีฟังก์ชันในการแปลงอ็อบเจ็กต์ Java เพื่อจับคู่โครงสร้าง JSON และในทางกลับกัน Gson ถูกสร้างขึ้นครั้งแรกโดยใช้ GsonBuilder จากนั้นใช้วิธี toJson (Object) หรือ fromJson (String, Class) เพื่ออ่าน / เขียนโครงสร้าง JSON

การประกาศคลาส

ต่อไปนี้เป็นคำประกาศสำหรับ com.google.gson.Gson ชั้นเรียน -

public final class Gson 
   extends Object

ตัวสร้าง

ซีเนียร์ No ตัวสร้างและคำอธิบาย
1

Gson()

สร้างวัตถุ Gson ด้วยการกำหนดค่าเริ่มต้น

วิธีการเรียน

ซีเนียร์ No วิธีการและคำอธิบาย
1

<T> T fromJson(JsonElement json, Class<T> classOfT)

เมธอดนี้ deserializes Json ที่อ่านจากแผนผังการแยกวิเคราะห์ที่ระบุลงในอ็อบเจ็กต์ของชนิดที่ระบุ

2

<T> T fromJson(JsonElement json, Type typeOfT)

เมธอดนี้ deserializes Json ที่อ่านจากแผนผังการแยกวิเคราะห์ที่ระบุลงในอ็อบเจ็กต์ของชนิดที่ระบุ

3

<T> T fromJson(JsonReader reader, Type typeOfT)

อ่านค่า JSON ถัดไปจากผู้อ่านและแปลงเป็นอ็อบเจ็กต์ประเภท typeOfT

4

<T> T fromJson(Reader json, Class<T> classOfT)

วิธีนี้ยกเลิกการกำหนดค่า Json ที่อ่านจากเครื่องอ่านที่ระบุลงในอ็อบเจ็กต์ของคลาสที่ระบุ

5

<T> T fromJson(Reader json, Type typeOfT)

วิธีนี้ยกเลิกการกำหนดค่า Json ที่อ่านจากเครื่องอ่านที่ระบุลงในอ็อบเจ็กต์ของชนิดที่ระบุ

6

<T> T fromJson(String json, Class<T> classOfT)

เมธอดนี้ deserializes Json ที่ระบุลงในอ็อบเจ็กต์ของคลาสที่ระบุ

7

<T> T fromJson(String json, Type typeOfT)

เมธอดนี้ deserialize Json ที่ระบุลงในอ็อบเจ็กต์ของชนิดที่ระบุ

8

<T> TypeAdapter<T> getAdapter(Class<T> type)

ส่งคืนอะแด็ปเตอร์ชนิดสำหรับชนิด

9

<T> TypeAdapter<T> getAdapter(TypeToken<T> type)

ส่งคืนอะแด็ปเตอร์ชนิดสำหรับชนิด

10

<T> TypeAdapter<T> getDelegateAdapter(TypeAdapterFactory skipPast, TypeToken<T> type)

วิธีนี้ใช้เพื่อรับอะแด็ปเตอร์ชนิดสำรองสำหรับชนิดที่ระบุ

11

String toJson(JsonElement jsonElement)

แปลงโครงสร้างของ JsonElements เป็นการแทนค่า JSON ที่เทียบเท่า

12

void toJson(JsonElement jsonElement, Appendable writer)

เขียน JSON ที่เทียบเท่าสำหรับโครงสร้างของ JsonElements

13

void toJson(JsonElement jsonElement, JsonWriter writer)

เขียน JSON สำหรับ jsonElement ให้กับนักเขียน

14

String toJson(Object src)

วิธีนี้ทำให้วัตถุที่ระบุเป็นอนุกรมเป็นตัวแทน Json ที่เทียบเท่า

15

void toJson(Object src, Appendable writer)

วิธีนี้ทำให้วัตถุที่ระบุเป็นอนุกรมเป็นตัวแทน Json ที่เทียบเท่า

16

String toJson(Object src, Type typeOfSrc)

วิธีนี้ทำให้วัตถุที่ระบุเป็นอนุกรมรวมทั้งประเภททั่วไปเป็นตัวแทน Json ที่เทียบเท่า

17

void toJson(Object src, Type typeOfSrc, Appendable writer)

วิธีนี้ทำให้วัตถุที่ระบุเป็นอนุกรมรวมทั้งประเภททั่วไปเป็นตัวแทน Json ที่เทียบเท่า

18

void toJson(Object src, Type typeOfSrc, JsonWriter writer)

เขียนการแทนค่า JSON ของ src ประเภท typeOfSrc ไปยัง writer

19

JsonElement toJsonTree(Object src)

วิธีนี้ทำให้วัตถุที่ระบุเป็นอนุกรมในการแทนค่าที่เทียบเท่ากันเป็นโครงสร้างของ JsonElements

20

JsonElement toJsonTree(Object src, Type typeOfSrc)

วิธีนี้ทำให้วัตถุที่ระบุเป็นอนุกรมรวมถึงประเภททั่วไปในการแทนค่าเทียบเท่ากับโครงสร้างของ JsonElements

21

String toString()

วิธีการสืบทอด

คลาสนี้สืบทอดวิธีการจากคลาสต่อไปนี้ -

  • java.lang.Object

ตัวอย่าง

สร้างโปรแกรม Java ต่อไปนี้โดยใช้โปรแกรมแก้ไขที่คุณเลือกและบันทึกไว้ที่ C: /> GSON_WORKSPACE

File − GsonTester.java

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder;  

public class GsonTester { 
   public static void main(String[] args) { 
      String jsonString = "{\"name\":\"Mahesh\", \"age\":21}"; 
      
      GsonBuilder builder = new GsonBuilder(); 
      builder.setPrettyPrinting(); 
      
      Gson gson = builder.create(); 
      Student student = gson.fromJson(jsonString, Student.class); 
      System.out.println(student);    
      
      jsonString = gson.toJson(student); 
      System.out.println(jsonString);  
   } 
}  

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:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

Student [ name: Mahesh, age: 21 ] 
{ 
   "name" : "Mahesh", 
   "age" : 21 
}

มาทำให้วัตถุ Java เป็นอนุกรมกับไฟล์ Json แล้วอ่านไฟล์ Json นั้นเพื่อรับวัตถุกลับมา ในตัวอย่างนี้เราได้สร้างไฟล์Studentชั้นเรียน เราจะสร้างไฟล์student.json ซึ่งจะมีไฟล์ json การเป็นตัวแทนของ Student วัตถุ.

ตัวอย่าง

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C:\>GSON_WORKSPACE.

ไฟล์ - GsonTester.java

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException;  

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      GsonTester tester = new GsonTester(); 
      try { 
         Student student = new Student(); 
         student.setAge(10); 
         student.setName("Mahesh"); 
         tester.writeJSON(student);  
         Student student1 = tester.readJSON(); 
         System.out.println(student1); 
      } 
      catch(FileNotFoundException e) { 
         e.printStackTrace(); 
      } 
      catch(IOException e) { 
         e.printStackTrace();
      } 
   } 
   
   private void writeJSON(Student student) throws IOException { 
      GsonBuilder builder = new GsonBuilder(); 
      Gson gson = builder.create(); 
      FileWriter writer = new FileWriter("student.json");   
      writer.write(gson.toJson(student));   
      writer.close(); 
   }  
   
   private Student readJSON() throws FileNotFoundException { 
      GsonBuilder builder = new GsonBuilder(); 
      Gson gson = builder.create(); 
      BufferedReader bufferedReader = new BufferedReader(
         new FileReader("student.json"));   
      
      Student student = gson.fromJson(bufferedReader, Student.class); 
      return student; 
   } 
} 

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:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

Student [ name: Mahesh, age: 10 ]

Data Binding API ใช้เพื่อแปลง JSON เป็นและจาก POJO (Plain Old Java Object) โดยใช้ตัวเข้าถึงคุณสมบัติหรือใช้คำอธิบายประกอบ เป็นสองประเภท

  • Primitives Data Binding - แปลง JSON ไปและกลับจาก Java Maps, Lists, Strings, Numbers, Booleans และ NULL object

  • Objects Data Binding - แปลง JSON เป็นและจากประเภท JAVA ใด ๆ

Gson อ่าน / เขียน JSON สำหรับการเชื่อมโยงข้อมูลทั้งสองประเภท การผูกข้อมูลนั้นคล้ายคลึงกับตัวแยกวิเคราะห์ JAXB สำหรับ XML

การผูกข้อมูลดั้งเดิม

การผูกข้อมูลแบบดั้งเดิมหมายถึงการแมปประเภทข้อมูล JSON กับ JAVA Core และคอลเลคชันในตัว Gson มีอะแด็ปเตอร์ inbuilt ต่างๆซึ่งสามารถใช้เพื่อทำให้เป็นอนุกรม / deserialize ชนิดข้อมูลพื้นฐาน

ตัวอย่าง

มาดูการรวมข้อมูลดั้งเดิมในการดำเนินการ ที่นี่เราจะจับคู่ประเภทพื้นฐานของ JAVA กับ JSON โดยตรงและในทางกลับกัน

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C:\>Gson_WORKSPACE.

File − GsonTester.java

import java.util.Arrays; 
import com.google.gson.Gson;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      Gson gson = new Gson();  
      String name = "Mahesh Kumar"; 
      long rollNo = 1; 
      boolean verified = false; 
      int[] marks = {100,90,85};  
      
      //Serialization 
      System.out.println("{"); 
      System.out.println("name: " + gson.toJson(name) +","); 
      System.out.println("rollNo: " + gson.toJson(rollNo) +","); 
      System.out.println("verified: " + gson.toJson(verified) +","); 
      System.out.println("marks:" + gson.toJson(marks)); 
      System.out.println("}");  
      
      //De-serialization 
      name = gson.fromJson("\"Mahesh Kumar\"", String.class); 
      rollNo = gson.fromJson("1", Long.class); 
      verified = gson.fromJson("false", Boolean.class); 
      marks = gson.fromJson("[100,90,85]", int[].class);  
      
      System.out.println("name: " + name); 
      System.out.println("rollNo: " + rollNo); 
      System.out.println("verified: " +verified); 
      System.out.println("marks:" + Arrays.toString(marks)); 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{ 
   name: "Mahesh Kumar", 
   rollNo: 1, 
   verified: false, 
   marks:[100,90,85] 
} 

name: Mahesh Kumar 
rollNo: 1 
verified: false 
marks:[100, 90, 85]

การผูกข้อมูลออบเจ็กต์หมายถึงการแมป JSON กับวัตถุ JAVA ใด ๆ

//Create a Gson instance 
Gson gson = new Gson();  

//map Student object to JSON content 
String jsonString = gson.toJson(student);   

//map JSON content to Student object 
Student student1 = gson.fromJson(jsonString, Student.class);

ตัวอย่าง

มาดูการเชื่อมโยงข้อมูลออบเจ็กต์กัน ที่นี่เราจะแมป JAVA Object กับ JSON โดยตรงและในทางกลับกัน

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

ไฟล์ - GsonTester.java

import com.google.gson.Gson;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      Gson gson = new Gson(); 
      Student student = new Student(); 
      student.setAge(10); 
      student.setName("Mahesh"); 
      
      String jsonString = gson.toJson(student);          
      System.out.println(jsonString); 
      
      Student student1 = gson.fromJson(jsonString, Student.class); 
      System.out.println(student1); 
   }   
} 

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:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"name":"Mahesh","age":10} 
Student [ name: Mahesh, age: 10 ]

Tree Model เตรียมการแสดงแผนผังในหน่วยความจำของเอกสาร JSON สร้างต้นไม้ของโหนด JsonObject เป็นแนวทางที่ยืดหยุ่นและคล้ายคลึงกับตัวแยกวิเคราะห์ DOM สำหรับ XML

สร้าง Tree จาก JSON

JsonParser จัดเตรียมตัวชี้ไปยังโหนดรูทของทรีหลังจากอ่าน JSON Root Node สามารถใช้เพื่อสำรวจต้นไม้ที่สมบูรณ์ พิจารณาข้อมูลโค้ดต่อไปนี้เพื่อรับโหนดรูทของสตริง JSON ที่ให้มา

//Create an JsonParser instance 
JsonParser parser = new JsonParser(); 

String jsonString = 
"{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}"; 

//create tree from JSON 
JsonElement rootNode = parser.parse(jsonString);

การข้ามแบบจำลองต้นไม้

รับแต่ละโหนดโดยใช้พา ธ สัมพัทธ์ไปยังโหนดรูทในขณะที่ข้ามต้นไม้และประมวลผลข้อมูล ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นว่าคุณสามารถสำรวจต้นไม้ได้อย่างไร

JsonObject details = rootNode.getAsJsonObject(); 

JsonElement nameNode = details.get("name"); 
System.out.println("Name: " +nameNode.getAsString()); 

JsonElement ageNode = details.get("age"); 
System.out.println("Age: " + ageNode.getAsInt());

ตัวอย่าง

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import com.google.gson.JsonArray; 
import com.google.gson.JsonElement; 
import com.google.gson.JsonObject; 
import com.google.gson.JsonParser;
import com.google.gson.JsonPrimitive;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      String jsonString = 
         "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";
      JsonParser parser = new JsonParser();  
      JsonElement rootNode = parser.parse(jsonString);  
      
      if (rootNode.isJsonObject()) { 
         JsonObject details = rootNode.getAsJsonObject();  
         JsonElement nameNode = details.get("name"); 
         System.out.println("Name: " +nameNode.getAsString());  
         
         JsonElement ageNode = details.get("age"); 
         System.out.println("Age: " + ageNode.getAsInt());  
         
         JsonElement verifiedNode = details.get("verified"); 
         System.out.println("Verified: " + (verifiedNode.getAsBoolean() ? "Yes":"No"));  
         JsonArray marks = details.getAsJsonArray("marks"); 
         
         for (int i = 0; i < marks.size(); i++) { 
            JsonPrimitive value = marks.get(i).getAsJsonPrimitive(); 
            System.out.print(value.getAsInt() + " ");  
         } 
      } 
   }   
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

Name: Mahesh Kumar 
Age: 21 
Verified: No 
100 90 85

Streaming API ใช้เพื่ออ่านโทเค็น JSON ด้วยโทเค็น มันอ่านและเขียนเนื้อหา JSON เป็นเหตุการณ์ที่ไม่ต่อเนื่องJsonReader และ JsonWriter อ่าน / เขียนข้อมูลเป็นโทเค็นเรียกว่า JsonToken.

เป็นแนวทางที่ทรงพลังที่สุดในสามวิธีในการประมวลผล JSON มีค่าใช้จ่ายต่ำสุดและค่อนข้างรวดเร็วในการอ่าน / เขียน คล้ายกับ Stax parser สำหรับ XML

ในบทนี้เราจะแสดงการใช้ GSON สตรีมมิ่ง API เพื่ออ่านข้อมูล JSON Streaming API ทำงานร่วมกับแนวคิดของโทเค็นและทุกรายละเอียดของ Json จะต้องได้รับการจัดการอย่างรอบคอบ

//create JsonReader object and pass it the json source or json text. 
JsonReader reader = new JsonReader(new StringReader(jsonString));  

//start reading json   
reader.beginObject(); 

//get the next token 
JsonToken token = reader.peek(); 

//check the type of the token 
if (token.equals(JsonToken.NAME)) {     
   //get the current token 
   fieldname = reader.nextName(); 
}

ตัวอย่าง

มาดูกัน JsonReaderในการดำเนินการ สร้างไฟล์คลาส Java ชื่อGsonTester ใน C: \> GSON_WORKSPACE

ไฟล์ - GsonTester.java

import java.io.IOException; 
import java.io.StringReader;  

import com.google.gson.stream.JsonReader; 
import com.google.gson.stream.JsonToken;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      String jsonString = 
         "{\"name\":\"Mahesh Kumar\", \"age\":21,\"verified\":false,\"marks\": [100,90,85]}";  
      JsonReader reader = new JsonReader(new StringReader(jsonString));    
      try { 
         handleJsonObject(reader); 
      } 
      catch (IOException e) { 
         e.printStackTrace(); 
      } 
   } 
   
   private static void handleJsonObject(JsonReader reader) throws IOException { 
      reader.beginObject(); 
      String fieldname = null; 
      
      while (reader.hasNext()) { 
         JsonToken token = reader.peek(); 
         
         if (token.equals(JsonToken.BEGIN_ARRAY)) { 
            System.out.print("Marks [ "); 
            handleJsonArray(reader); 
            System.out.print("]"); 
         } else if (token.equals(JsonToken.END_OBJECT)) { 
            reader.endObject(); 
            return; 
         } else {            
            if (token.equals(JsonToken.NAME)) {     
               //get the current token 
               fieldname = reader.nextName(); 
            } 
            
            if ("name".equals(fieldname)) {       
               //move to next token 
               token = reader.peek(); 
               System.out.println("Name: "+reader.nextString());           
            } 
            
            if("age".equals(fieldname)) { 
               //move to next token 
               token = reader.peek(); 
               System.out.println("Age:" + reader.nextInt());       
            } 
            
            if("verified".equals(fieldname)) { 
               //move to next token 
               token = reader.peek(); 
               System.out.println("Verified:" + reader.nextBoolean());           
            }             
         } 
      } 
   }  
   
   private static void handleJsonArray(JsonReader reader) throws IOException { 
      reader.beginArray(); 
      String fieldname = null; 
      
      while (true) { 
         JsonToken token = reader.peek(); 
         
         if (token.equals(JsonToken.END_ARRAY)) { 
            reader.endArray(); 
            break; 
         } else if (token.equals(JsonToken.BEGIN_OBJECT)) { 
            handleJsonObject(reader); 
         } else if (token.equals(JsonToken.END_OBJECT)) { 
            reader.endObject(); 
         } else {            
            System.out.print(reader.nextInt() + " ");            
         } 
      } 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

Name: Mahesh Kumar 
Age:21 
Verified:false 
Marks [ 100 90 85 ]

ในบทนี้เราจะพูดถึงการทำให้เป็นอนุกรม / การดีซีเรียลไลเซชันของอาร์เรย์คอลเลกชันและข้อมูลทั่วไป

ตัวอย่างอาร์เรย์

int[] marks = {100,90,85}; 
//Serialization 
System.out.println("marks:" + gson.toJson(marks));        

//De-serialization 
marks = gson.fromJson("[100,90,85]", int[].class); 
System.out.println("marks:" + Arrays.toString(marks));

ตัวอย่าง

มาดูการทำงานของ Array serialization / de-serialization สร้างไฟล์คลาส Java ชื่อGsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import java.util.Arrays; 
import com.google.gson.Gson;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      Gson gson = new Gson(); 
      int[] marks = {100,90,85}; 
      String[] names = {"Ram","Shyam","Mohan"}; 
      
      //Serialization 
      System.out.print("{"); 
      System.out.print("marks:" + gson.toJson(marks) + ",");       
      System.out.print("names:" + gson.toJson(names));       
      System.out.println("}");  
      
      //De-serialization 
      marks = gson.fromJson("[100,90,85]", int[].class); 
      names = gson.fromJson("[\"Ram\",\"Shyam\",\"Mohan\"]", String[].class);
      System.out.println("marks:" + Arrays.toString(marks)); 
      System.out.println("names:" + Arrays.toString(names));     
   }      
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{marks:[100,90,85],names:["Ram","Shyam","Mohan"]} 
marks:[100, 90, 85] 
names:[Ram, Shyam, Mohan]

ตัวอย่างคอลเลกชัน

List marks = new ArrayList(); 
//Serialization 
System.out.println("marks:" + gson.toJson(marks));        

//De-serialization 
//get the type of the collection. 
Type listType = new TypeToken<list>(){}.getType(); 

//pass the type of collection 
marks = gson.fromJson("[100,90,85]", listType); 
System.out.println("marks:" +marks);</list>

ตัวอย่าง

มาดูการทำงานของ Collection serialization / de-serialization สร้างไฟล์คลาส Java ชื่อGsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import java.lang.reflect.Type; 
import java.util.ArrayList; 
import java.util.Collection;  

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      Gson gson = new Gson(); 
      Collection<Integer> marks = new ArrayList<Integer>();  
      marks.add(100); 
      marks.add(90); 
      marks.add(85);  
      
      //Serialization 
      System.out.print("{"); 
      System.out.print("marks:" + gson.toJson(marks));             
      System.out.println("}");  
      
      //De-serialization 
      Type listType = new TypeToken<Collection<Integer>>(){}.getType(); 
      marks = gson.fromJson("[100,90,85]", listType); 
      System.out.println("marks:" +marks);     
   }      
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{marks:[100,90,85]} 
marks:[100, 90, 85]

ตัวอย่าง Generics

Gson ใช้ Java สะท้อน API เพื่อรับชนิดของวัตถุที่จะแมปข้อความ Json แต่ด้วยข้อมูลทั่วไปข้อมูลนี้จะสูญหายไประหว่างการทำให้เป็นอนุกรม เพื่อแก้ปัญหานี้ Gson จัดเตรียมคลาสcom.google.gson.reflect.TypeToken เพื่อจัดเก็บประเภทของวัตถุทั่วไป

ตัวอย่าง

มาดูการใช้งาน Generics serialization / de-serialization สร้างไฟล์คลาส Java ชื่อGsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import java.lang.reflect.Type; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      // create a shape class of type circle. 
      Shape<Circle> shape = new Shape<Circle>();  
      
      // Create a Circle object 
      Circle circle = new Circle(5.0);  
      
      //assign circle to shape 
      shape.setShape(circle);  
      Gson gson = new Gson(); 
      
      // Define a Type shapeType of type circle. 
      Type shapeType = new TypeToken<Shape<Circle>>() {}.getType();  
      
      //Serialize the json as ShapeType 
      String jsonString = gson.toJson(shape, shapeType); 
      System.out.println(jsonString);  
      Shape shape1 = gson.fromJson(jsonString, Shape.class); 
      
      System.out.println(shape1.get().getClass()); 
      System.out.println(shape1.get().toString()); 
      System.out.println(shape1.getArea());  
      Shape shape2 = gson.fromJson(jsonString, shapeType); 
      System.out.println(shape2.get().getClass()); 
      System.out.println(shape2.get().toString()); 
      System.out.println(shape2.getArea()); 
   }      
}  

class Shape <T> { 
   public T shape;  
   
   public void setShape(T shape) { 
      this.shape = shape; 
   }  
   public T get() { 
      return shape; 
   }  
   public double getArea() { 
      if(shape instanceof Circle) { 
         return ((Circle) shape).getArea(); 
      } else { 
         return 0.0; 
      } 
   } 
}  

class Circle { 
   private double radius;  
   
   public Circle(double radius){ 
      this.radius = radius; 
   }  
   public String toString() { 
      return "Circle"; 
   }  
   public double getRadius() { 
      return radius; 
   }  
   public void setRadius(double radius) { 
      this.radius = radius; 
   }  
   public double getArea() { 
      return (radius*radius*3.14); 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"shape":{"radius":5.0}} 
class com.google.gson.internal.LinkedTreeMap 
{radius = 5.0} 
0.0 
class Circle 
Circle 
78.5

ในบทนี้เราจะอธิบายการทำให้เป็นอนุกรม / deserialization ของคลาสที่มีคลาสภายใน

ตัวอย่างคลาสภายในที่ซ้อนกัน

Student student = new Student(); 
student.setRollNo(1); 
Student.Name name = student.new Name(); 
name.firstName = "Mahesh"; 
name.lastName = "Kumar"; 

student.setName(name); 
//serialize inner class object 
String nameString = gson.toJson(name); 
System.out.println(nameString); 

//deserialize inner class object   
name = gson.fromJson(nameString,Student.Name.class); 
System.out.println(name.getClass());

ตัวอย่าง

ลองดูตัวอย่างของการทำให้เป็นอนุกรม / การทำให้เป็นอนุกรมของคลาสที่มีคลาสภายในในการดำเนินการ สร้างไฟล์คลาส Java ชื่อGsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import com.google.gson.Gson;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      Student student = new Student();  
      student.setRollNo(1); 
      Student.Name name = student.new Name(); 
      
      name.firstName = "Mahesh"; 
      name.lastName = "Kumar"; 
      student.setName(name); 
      Gson gson = new Gson(); 
      
      String jsonString = gson.toJson(student); 
      System.out.println(jsonString);  
      student = gson.fromJson(jsonString, Student.class);  
      
      System.out.println("Roll No: "+ student.getRollNo()); 
      System.out.println("First Name: "+ student.getName().firstName); 
      System.out.println("Last Name: "+ student.getName().lastName);  
      
      String nameString = gson.toJson(name); 
      System.out.println(nameString);  
      
      name = gson.fromJson(nameString,Student.Name.class); 
      System.out.println(name.getClass()); 
      System.out.println("First Name: "+ name.firstName); 
      System.out.println("Last Name: "+ name.lastName); 
   }      
}  

class Student { 
   private int rollNo; 
   private Name name;  
   
   public int getRollNo() { 
      return rollNo; 
   }
   
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   }  
   
   public Name getName() { 
      return name; 
   } 
   
   public void setName(Name name) { 
      this.name = name; 
   }
   
   class Name { 
      public String firstName; 
      public String lastName; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"rollNo":1,"name":{"firstName":"Mahesh","lastName":"Kumar"}} 
Roll No: 1 
First Name: Mahesh 
Last Name: Kumar 

{"firstName":"Mahesh","lastName":"Kumar"} 
class Student$Name 
First Name: Mahesh 
Last Name: Kumar

ตัวอย่างคลาสภายในแบบคงที่ซ้อนกัน

Student student = new Student(); 
student.setRollNo(1); 
Student.Name name = new Student.Name(); 

name.firstName = "Mahesh"; 
name.lastName = "Kumar"; 
student.setName(name); 

//serialize static inner class object 
String nameString = gson.toJson(name); 
System.out.println(nameString); 

//deserialize static inner class object   
name = gson.fromJson(nameString,Student.Name.class); 
System.out.println(name.getClass());

ตัวอย่าง

ลองดูตัวอย่างของการทำให้เป็นอนุกรม / การทำให้เป็นอนุกรมของคลาสที่มีการใช้งานคลาสภายในแบบคงที่ สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import com.google.gson.Gson;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      Student student = new Student();  
      student.setRollNo(1); 
      Student.Name name = new Student.Name(); 
      
      name.firstName = "Mahesh"; 
      name.lastName = "Kumar";  
      student.setName(name); 
      
      Gson gson = new Gson(); 
      String jsonString = gson.toJson(student); 
      System.out.println(jsonString);  
      student = gson.fromJson(jsonString, Student.class);  
      
      System.out.println("Roll No: "+ student.getRollNo()); 
      System.out.println("First Name: "+ student.getName().firstName); 
      System.out.println("Last Name: "+ student.getName().lastName);  
      String nameString = gson.toJson(name); 
      System.out.println(nameString);  
      
      name = gson.fromJson(nameString,Student.Name.class); 
      System.out.println(name.getClass()); 
      System.out.println("First Name: "+ name.firstName); 
      System.out.println("Last Name: "+ name.lastName); 
   }      
}  

class Student { 
   private int rollNo; 
   private Name name;  
   
   public int getRollNo() { 
      return rollNo; 
   }  
   
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   }  
   
   public Name getName() { 
      return name; 
   }  
   
   public void setName(Name name) { 
      this.name = name; 
   } 
   
   static class Name { 
      public String firstName; 
      public String lastName; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"rollNo":1,"name":{"firstName":"Mahesh","lastName":"Kumar"}} 
Roll No: 1 
First Name: Mahesh 
Last Name: Kumar 

{"firstName":"Mahesh","lastName":"Kumar"} 
class Student$Name 
First Name: Mahesh 
Last Name: Kumar

Gson ดำเนินการซีเรียลไลเซชั่น / การดีซีเรียลไลเซชันของอ็อบเจ็กต์โดยใช้อะแด็ปเตอร์ inbuilt นอกจากนี้ยังรองรับอะแดปเตอร์แบบกำหนดเอง มาดูวิธีสร้างอะแดปเตอร์แบบกำหนดเองและวิธีใช้งาน

สร้าง Custom Adapter

สร้างอะแด็ปเตอร์แบบกำหนดเองโดยขยายไฟล์ TypeAdapterคลาสและส่งผ่านประเภทของวัตถุที่กำหนดเป้าหมาย แทนที่read และ write วิธีการดำเนินการ deserialization และ serialization แบบกำหนดเองตามลำดับ

class StudentAdapter extends TypeAdapter<Student> { 
   @Override 
   public Student read(JsonReader reader) throws IOException { 
      ... 
   } 
   
   @Override 
   public void write(JsonWriter writer, Student student) throws IOException { 
   } 
}

ลงทะเบียน Custom Adapter

ลงทะเบียนอะแด็ปเตอร์ที่กำหนดเองโดยใช้ GsonBuilder และสร้างอินสแตนซ์ Gson โดยใช้ GsonBuilder.

GsonBuilder builder = new GsonBuilder(); 
builder.registerTypeAdapter(Student.class, new StudentAdapter()); 
Gson gson = builder.create();

ใช้อะแดปเตอร์

ตอนนี้ Gson จะใช้อะแดปเตอร์ที่กำหนดเองเพื่อแปลงข้อความ Json เป็นวัตถุและในทางกลับกัน

String jsonString = "{\"name\":\"Mahesh\", \"rollNo\":1}"; 
Student student = gson.fromJson(jsonString, Student.class); 
System.out.println(student);  
jsonString = gson.toJson(student); 
System.out.println(jsonString);

ตัวอย่าง

มาดูตัวอย่างการทำงานของอะแดปเตอร์ประเภทกำหนดเอง สร้างไฟล์คลาส Java ชื่อGsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import java.io.IOException;  

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.TypeAdapter; 
import com.google.gson.stream.JsonReader; 
import com.google.gson.stream.JsonToken; 
import com.google.gson.stream.JsonWriter;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      GsonBuilder builder = new GsonBuilder(); 
      builder.registerTypeAdapter(Student.class, new StudentAdapter()); 
      builder.setPrettyPrinting(); 
      Gson gson = builder.create();  
      
      String jsonString = "{\"name\":\"Mahesh\", \"rollNo\":1}";  
      Student student = gson.fromJson(jsonString, Student.class); 
      System.out.println(student);  
      
      jsonString = gson.toJson(student); 
      System.out.println(jsonString);  
   }      
}  

class StudentAdapter extends TypeAdapter<Student> { 
   @Override 
   public Student read(JsonReader reader) throws IOException { 
      Student student = new Student(); 
      reader.beginObject(); 
      String fieldname = null; 
      
      while (reader.hasNext()) { 
         JsonToken token = reader.peek();            
         
         if (token.equals(JsonToken.NAME)) {     
            //get the current token 
            fieldname = reader.nextName(); 
         } 
         
         if ("name".equals(fieldname)) {       
            //move to next token 
            token = reader.peek(); 
            student.setName(reader.nextString()); 
         } 
         
         if("rollNo".equals(fieldname)) { 
            //move to next token 
            token = reader.peek(); 
            student.setRollNo(reader.nextInt()); 
         }               
      } 
      reader.endObject(); 
      return student; 
   }  
   
   @Override 
   public void write(JsonWriter writer, Student student) throws IOException { 
      writer.beginObject(); 
      writer.name("name"); 
      writer.value(student.getName()); 
      writer.name("rollNo"); 
      writer.value(student.getRollNo()); 
      writer.endObject(); 
   } 
}  

class Student { 
   private int rollNo; 
   private String name;  
   
   public int getRollNo() { 
      return rollNo; 
   } 
   
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   }  
   
   public String getName() { 
      return name; 
   }  
   
   public void setName(String name) { 
      this.name = name; 
   }   
   
   public String toString() { 
      return "Student[ name = "+name+", roll no: "+rollNo+ "]"; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

Student[ name = Mahesh, roll no: 1] 
{ 
   "name": "Mahesh", 
   "rollNo": 1 
}

ตามค่าเริ่มต้น Gson จะสร้างเนื้อหา Json ที่ปรับให้เหมาะสมโดยไม่สนใจค่า NULL แต่ GsonBuilder จัดเตรียมแฟล็กเพื่อแสดงค่า NULL ในเอาต์พุต Json โดยใช้GsonBuilder.serializeNulls() วิธี.

GsonBuilder builder = new GsonBuilder(); 
builder.serializeNulls(); 
Gson gson = builder.create();

ตัวอย่างที่ไม่มี SerializeNulls Call

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

ไฟล์ - GsonTester.java

import com.google.gson.Gson;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      Gson gson = new Gson();  
      
      Student student = new Student(); 
      student.setRollNo(1);  
      String jsonString = gson.toJson(student); 
      
      System.out.println(jsonString);  
      student = gson.fromJson(jsonString, Student.class); 
      System.out.println(student); 
   }      
} 

class Student { 
   private int rollNo; 
   private String name;  
   
   public int getRollNo() { 
      return rollNo; 
   }  
   
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   } 
   
   public String getName() { 
      return name; 
   }  
   
   public void setName(String name) { 
      this.name = name; 
   } 
   
   public String toString() { 
      return "Student[ name = "+name+", roll no: "+rollNo+ "]"; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"rollNo": 1} 
Student[ name = null, roll no: 1]

ตัวอย่างด้วยการเรียก serializeNulls

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

ไฟล์ - GsonTester.java

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      GsonBuilder builder = new GsonBuilder(); 
      builder.serializeNulls(); 
      builder.setPrettyPrinting(); 
      Gson gson = builder.create();  
      
      Student student = new Student(); 
      student.setRollNo(1);  
      String jsonString = gson.toJson(student); 
      
      System.out.println(jsonString);  
      student = gson.fromJson(jsonString, Student.class); 
      System.out.println(student); 
   }      
} 
class Student { 
   private int rollNo; 
   private String name;  
   
   public int getRollNo() { 
      return rollNo; 
   }  
   
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   }  
   
   public String getName() { 
      return name; 
   }  
   
   public void setName(String name) { 
      this.name = name; 
   } 
   
   public String toString() { 
      return "Student[ name = "+name+", roll no: "+rollNo+ "]"; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{ 
   "rollNo": 1, 
   "name": null 
} 
Student[ name = null, roll no: 1]

Gson ให้ @Sinceคำอธิบายประกอบเพื่อควบคุม Json serialization / deserialization ของคลาสตามเวอร์ชันต่างๆ พิจารณาคลาสต่อไปนี้ที่รองรับการกำหนดเวอร์ชัน ในคลาสนี้เราได้กำหนดตัวแปรไว้สองตัวrollNo และ name และต่อมาเราได้เพิ่ม verifiedเป็นตัวแปรใหม่ ใช้ @Since เราได้กำหนดไว้rollNo และ name เป็นเวอร์ชัน 1.0 และตรวจสอบแล้วว่าเป็นเวอร์ชัน 1.1

class Student { 
   @Since(1.0) 
   private int rollNo; 
   
   @Since(1.0) 
   private String name; 
   
   @Since(1.1) 
   private boolean verified;  
}

GsonBuilder ให้ไฟล์ setVersion() วิธีการจัดลำดับคลาสที่กำหนดเวอร์ชันดังกล่าว

GsonBuilder builder = new GsonBuilder(); 
builder.setVersion(1.0);   
Gson gson = builder.create();

ตัวอย่าง

มาดูตัวอย่างของการสนับสนุนเวอร์ชันในการดำเนินการ สร้างไฟล์คลาส Java ชื่อGsonTester ใน C: \> GSON_WORKSPACE

ไฟล์ - GsonTester.java

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.annotations.Since;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      GsonBuilder builder = new GsonBuilder(); 
      builder.setVersion(1.0);   
      Gson gson = builder.create();
      
      Student student = new Student(); 
      student.setRollNo(1); 
      student.setName("Mahesh Kumar"); 
      student.setVerified(true);  
      
      String jsonString = gson.toJson(student); 
      System.out.println(jsonString);  
      
      gson = new Gson();     
      jsonString = gson.toJson(student); 
      System.out.println(jsonString); 
   }      
} 

class Student { 
   @Since(1.0) 
   private int rollNo; 
   
   @Since(1.0) 
   private String name; 
   
   @Since(1.1) 
   private boolean verified;   
   
   public int getRollNo() { 
      return rollNo; 
   }  
   
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   } 
   
   public String getName() { 
      return name; 
   } 
   
   public void setName(String name) { 
      this.name = name; 
   }
   
   public void setVerified(boolean verified) { 
      this.verified = verified; 
   }  
   
   public boolean isVerified() { 
      return verified; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"rollNo":1,"name":"Mahesh Kumar"} 
{"rollNo":1,"name":"Mahesh Kumar","verified":true}

ตามค่าเริ่มต้น GSON จะไม่รวมฟิลด์ชั่วคราวและฟิลด์สแตติกจากกระบวนการซีเรียลไลเซชัน / ดีซีเรียลไลเซชัน ลองดูตัวอย่างต่อไปนี้

ตัวอย่าง

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      GsonBuilder builder = new GsonBuilder();     
      Gson gson = builder.create();  
      
      Student student = new Student(); 
      student.setRollNo(1); 
      student.setName("Mahesh Kumar"); 
      student.setVerified(true); 
      student.setId(1); 
      student.className = "VI";  
      
      String jsonString = gson.toJson(student); 
      System.out.println(jsonString);    
   }      
} 

class Student { 
   private int rollNo; 
   private String name; 
   private boolean verified;  
   private transient int id; 
   public static String className;  
   
   public int getRollNo() {
      return rollNo; 
   }  
   
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   } 
   
   public String getName() { 
      return name; 
   } 
   
   public void setName(String name) { 
      this.name = name; 
   }  
   
   public void setVerified(boolean verified) { 
      this.verified = verified; 
   }  
   
   public boolean isVerified() { 
      return verified; 
   }  
   
   public int getId() { 
      return id; 
   } 
   
   public void setId(int id) { 
      this.id = id; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"rollNo":1,"name":"Mahesh Kumar","verified":true}

การใช้ excludeFieldsWithModifiers

GsonBuilder ให้การควบคุมการยกเว้นฟิลด์ด้วยตัวปรับแต่งเฉพาะโดยใช้เมธอด excludeFieldsWithModifiers () จากกระบวนการ serialization / deserialization ดูตัวอย่างต่อไปนี้

ตัวอย่าง

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import java.lang.reflect.Modifier; 

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      GsonBuilder builder = new GsonBuilder(); 
      builder.excludeFieldsWithModifiers(Modifier.TRANSIENT);    
      Gson gson = builder.create();  
      
      Student student = new Student(); 
      student.setRollNo(1); 
      student.setName("Mahesh Kumar"); 
      student.setVerified(true); 
      student.setId(1); 
      student.className = "VI";  
      
      String jsonString = gson.toJson(student); 
      System.out.println(jsonString);    
   }      
} 

class Student { 
   private int rollNo; 
   private String name;
   private boolean verified;  
   private transient int id; 
   public static String className;  
   
   public int getRollNo() { 
      return rollNo; 
   }  
   
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   }  
   
   public String getName() { 
      return name; 
   }  
   
   public void setName(String name) { 
      this.name = name; 
   }  
   
   public void setVerified(boolean verified) { 
      this.verified = verified; 
   }  
   
   public boolean isVerified() { 
      return verified; 
   } 
   
   public int getId() { 
      return id; 
   } 
   
   public void setId(int id) { 
      this.id = id; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"rollNo":1,"name":"Mahesh Kumar","verified":true,"className":"VI"}

ใช้ @Expose Annotation

Gson ให้ @Exposeคำอธิบายประกอบเพื่อควบคุม Json serialization / deserialization ของคลาสตามขอบเขต พิจารณาคลาสต่อไปนี้ด้วยตัวแปรที่มี@Exposeสนับสนุน. ในชั้นเรียนนี้name และ rollnoตัวแปรจะถูกเปิดเผยสำหรับการทำให้เป็นอนุกรม จากนั้นเราได้ใช้ไฟล์GsonBuilder.excludeFieldsWithoutExposeAnnotation()วิธีการระบุว่าตัวแปรที่เปิดเผยเท่านั้นที่จะถูกทำให้เป็นอนุกรม / deserialized ดูตัวอย่างต่อไปนี้

ตัวอย่าง

สร้างไฟล์คลาส Java ชื่อ GsonTester ใน C: \> GSON_WORKSPACE

File − GsonTester.java

import com.google.gson.Gson; 
import com.google.gson.GsonBuilder; 
import com.google.gson.annotations.Expose;  

public class GsonTester { 
   public static void main(String args[]) { 
   
      GsonBuilder builder = new GsonBuilder();     
      builder.excludeFieldsWithoutExposeAnnotation(); 
      Gson gson = builder.create();  
      
      Student student = new Student(); 
      student.setRollNo(1); 
      student.setName("Mahesh Kumar"); 
      student.setVerified(true); 
      student.setId(1); 
      student.className = "VI"; 
      
      String jsonString = gson.toJson(student); 
      System.out.println(jsonString);    
   }      
} 
class Student { 
   @Expose 
   private int rollNo; 
   
   @Expose 
   private String name; 
   private boolean verified;  
   private int id; 
   public static String className;  
   
   public int getRollNo() { 
      return rollNo; 
   }  
   public void setRollNo(int rollNo) { 
      this.rollNo = rollNo; 
   }  
   public String getName() { 
      return name; 
   }  
   public void setName(String name) { 
      this.name = name; 
   }  
   public void setVerified(boolean verified) { 
      this.verified = verified; 
   }  
   public boolean isVerified() { 
      return verified; 
   }  
   public int getId() { 
      return id; 
   }  
   public void setId(int id) { 
      this.id = id; 
   } 
}

ตรวจสอบผลลัพธ์

รวบรวมคลาสโดยใช้ javac คอมไพเลอร์ดังนี้ -

C:\GSON_WORKSPACE>javac GsonTester.java

ตอนนี้เรียกใช้ GsonTester เพื่อดูผลลัพธ์ -

C:\GSON_WORKSPACE>java GsonTester

ตรวจสอบผลลัพธ์

{"rollNo":1,"name":"Mahesh Kumar"}