GSON (GitHub: https://github.com/google/gson) เป็นไลบรารีคลาส Java ที่ Google จัดทำโดย Google สำหรับการทำแผนที่ระหว่างวัตถุ Java และข้อมูล JSON คุณสามารถแปลงสตริง JSON เป็นวัตถุ Java หรือในทางกลับกัน
วัตถุที่สำคัญที่สุดใน GSON คือ 2 GSONS และ GSONBUILDERS
GSON มี 2 วิธีพื้นฐานที่สุด (1) TOJSON () เพื่อแปลงวัตถุ Java เป็น JSON
(2) FromJSON () แปลง JSON เป็นวัตถุ Java
เขียนคลาสเอนทิตี:
คนชั้นเรียนสาธารณะ {ชื่อสตริง; อายุ int; Setname บูลีน; สตริงสาธารณะ getName () {ชื่อคืน; } โมฆะสาธารณะ setName (ชื่อสตริง) {this.name = name; } public int getage () {return Age; } การตั้งค่าโมฆะสาธารณะ (อายุ int) {this.age = อายุ; } บูลีนสาธารณะ getSetName () {return setName; } โมฆะสาธารณะ setSetName (setName บูลีน) {this.setName = setName; } @Override สตริงสาธารณะ toString () {return "name =" + name + "age =" + อายุ + "setName =" + setName; -เขียนคลาสทดสอบ gStest
นำเข้า com.google.gson.exclusionsTrategy; นำเข้า com.google.gson.fieldattributes; นำเข้า com.google.gson.gson; นำเข้า com.google.gson.gsonbuilder;/*** แปลงวัตถุ Java เป็น JSON */คลาสสาธารณะ GSnetest {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {คน p = คนใหม่ (); p.setage (20); P.SetName ("คน"); P.SetSetName (จริง); GSON GSON = New GSON (); System.out.println (gson.tojson (p)); -ผลลัพธ์ผลลัพธ์:
{"ชื่อ": "คน", "อายุ": 20, "setName": true}นี่เป็นเพียงวิธีที่ง่ายที่สุดในการใช้ GSON จะใช้งานได้อย่างไรหากเราต้องการแปลงชื่อแอตทริบิวต์ของประเภทบูลไม่ให้แปลงเมื่อแปลงเป็น JSON?
หลังจากค้นหาในแพ็คเกจของ GSON เป็นเวลานานฉันพบว่ามีอินเทอร์เฟซภายใต้แพ็คเกจ com.google.gson: ExclusionsTrategy แม้ว่าฉันจะไม่รู้ว่ามันทำอะไรขึ้นอยู่กับชื่อ แต่ก็สามารถอนุมานได้ว่าอินเทอร์เฟซนี้ใช้เพื่อตั้งค่ากลยุทธ์การยกเว้นสำหรับการแปลง GSON ดังนั้นฉันจึงตรวจสอบอินเทอร์เฟซนี้บนเว็บไซต์อย่างเป็นทางการ ดังนั้นรหัสต่อไปนี้คือ:
นำเข้า com.google.gson.exclusionstrategy; นำเข้า com.google.gson.fieldattributes; นำเข้า com.google.gson.gson; นำเข้า com.google.gson.gsonbuilder;/*** แปลงวัตถุ Java เป็น JSON */คลาสสาธารณะ GSnetest {โมฆะสาธารณะคงที่หลัก (สตริง [] args) {คน p = คนใหม่ (); p.setage (20); P.SetName ("คน"); P.SetSetName (จริง); ExclusionsTrategy excludestrategy = new SetterExClusionsTrateGy (); GSON GSON1 = new GsonBuilder () .SetExClusionStrategies (extrudestrategy) .Create (); GSON GSON2 = New GSON (); สตริง json1 = gson1.tojson (p); สตริง json2 = gson2.tojson (p); System.out.println (Json1); System.out.println (Json2); คน p1 = gson1.fromjson (json1, people.class); คน p2 = gson2.fromjson (json2, people.class); System.out.println (P1); System.out.println (P2); } คลาสคงที่คลาส SetterExClusionsTrategy ใช้ ExclusionStrategy {บูลีนสาธารณะควรได้รับ (คลาส <?> clazz) {return false; } บูลีนสาธารณะควรใช้ SKIPField (FieldAttributes f) {return f.getName (). startswith ("set"); -ปรากฎว่ามีสองวิธีในการสร้างวัตถุ GSON: ใหม่ GSON () หมายถึงการสร้างวัตถุ GSON โดยใช้การกำหนดค่าเริ่มต้นและหากสร้างขึ้นโดยใช้วิธี gsonBuilder.create () คุณสามารถปรับแต่งการตั้งค่าบางอย่างเพื่อทำให้ GSN สร้างขึ้นเหมาะสมกว่าสำหรับสถานการณ์เฉพาะบางอย่าง รหัสสีน้ำเงินตัวแรกในตัวอย่างด้านบนสร้างวัตถุ GSON ซึ่งมีการกำหนดค่าคุณสมบัติการกรองเริ่มต้นด้วยคำว่า "set" (ถ้าคุณต้องการกรองประเภทหนึ่งคุณสามารถเขียนใหม่ควรใช้วิธีการใช้งานหลายครั้ง ดังนั้นในตัวอย่างนี้เมื่อแปลงผู้คนคัดค้าน JSON จะมีการกรองแอตทริบิวต์ เนื่องจากไม่มีแอตทริบิวต์ setName ใน JSON1 เมื่อ deserializing JSON1 ลงในวัตถุ PENESS, setName ของประเภทบูลีนไม่มีค่าดังนั้นเมื่อพิมพ์ค่าเริ่มต้นของประเภทบูลีนจะถูกนำมาใช้ ดังนั้นผลลัพธ์ต่อไปนี้จึงได้รับ:
{"ชื่อ": "ผู้คน", "อายุ": 20} {"ชื่อ": "คน", "อายุ": 20, "setName": true} name = people ge = 20 setName = falsename = people ens = 20 setName = trueGSON ยังสนับสนุนการใช้คำอธิบายประกอบ ในแพ็คเกจ com.google.gson.annotation มีคำอธิบายประกอบหลายรายการเปิดเผยชื่อ SerializedName ตั้งแต่และจนกว่าจะถึง พวกเขาแต่ละคนมีหน้าที่ของตัวเอง ต่อไปนี้เป็นตัวอย่างอย่างเป็นทางการในการแนะนำคำอธิบายประกอบที่ใช้กันทั่วไป:
เปิดเผย:
คำอธิบายประกอบนี้ทำหน้าที่ในแอตทริบิวต์ซึ่งบ่งชี้ว่าเมื่อการทำให้เป็นอนุกรมและการลดน้ำหนักแอตทริบิวต์นี้จะสัมผัสกับวัตถุ GSON คำอธิบายประกอบนี้ใช้ได้เฉพาะเมื่อวัตถุ GSON ถูกสร้างขึ้นโดยใช้วิธี GSONBUILDER และวิธี gsonBuilder.excludefieldswithoutexposeannotation () เรียกว่ามิฉะนั้นจะไม่ถูกต้อง นี่คือตัวอย่างการแนะนำวิธีใช้คำอธิบายประกอบ @Expose:
ผู้ใช้คลาสสาธารณะ {@Expose Private String FirstName; @Expose (serialize = false) สตริงส่วนตัวนามสกุล; @Expose (serialize = false, deserialize = false) emailaddress สตริงส่วนตัว; รหัสผ่านสตริงส่วนตัว}หากคุณสร้างวัตถุ GSON ในเมธอด GSON () ใหม่วิธี TOJSON () และวิธีการ FromJSON () จะใช้งานคุณสมบัติ 4 ข้อเหล่านี้เมื่ออนุกรมและ deserializing อย่างไรก็ตามหากคุณใช้ GSON GSON = new GsonBuilder (). Excludefieldswithoutexposeannotation (). สร้าง () เพื่อสร้างวัตถุ GSON, วิธี TOJSON ของ GSON () และ fromJSON () จะไม่รวมฟิลด์รหัสผ่านเนื่องจากฟิลด์รหัสผ่านไม่ได้ทำเครื่องหมาย วัตถุ GSON นี้จะยกเว้นฟิลด์ LastName และ EmailAddress เนื่องจากแอตทริบิวต์ @Expose ที่เป็นอนุกรมจะถูกตั้งค่าเป็นเท็จ ในทำนองเดียวกัน GSON จะไม่รวมฟิลด์ emailaddress ระหว่าง deserialization เนื่องจาก deserialize ถูกตั้งค่าเป็นเท็จ
serializedName:
คำอธิบายประกอบนี้ใช้กับแอตทริบิวต์ซึ่งบ่งชี้ว่าเมื่อแอตทริบิวต์นี้ถูกทำให้เป็นอนุกรมใน JSON ชื่อจะต้องมีการจัดลำดับตามค่าที่ระบุโดยแอตทริบิวต์ค่าคำอธิบายประกอบ
คำอธิบายประกอบนี้จะแทนที่ FieldNamingPolicy ใด ๆ รวมถึงนโยบายการตั้งชื่อเริ่มต้น นี่คือตัวอย่างการแนะนำวิธีการใช้คำอธิบายประกอบ @SerializedName:
คลาสสาธารณะ someclasswithfields {@SerializedName ("ชื่อ") สตริงสุดท้ายส่วนตัวบางฟิลด์; สตริงสุดท้ายส่วนตัว Someotherfield; สาธารณะ someclasswithfields (สตริง A, String b) {this.somefield = a; this.someotherfield = b; -รหัสต่อไปนี้แสดงผลลัพธ์ของการทำให้เป็นอนุกรมการทดสอบด้านบน:
someclasswithfields objectToserialize = new SomeClassWithFields ("A", "B"); GSON GSON = new GSON (); String JsonRepresentation = GSON.tojson (ObjectToserialize); System.out.printlnผลการดำเนินการคือ:
{"ชื่อ": "A", "Someotherfield": "B"}จะเห็นได้ว่าสถานที่ให้บริการ "Somefield" ได้รับการจัดอันดับให้เป็น "ชื่อ"
หมายเหตุ: ชื่อแอตทริบิวต์ที่ระบุในค่าของ @SerializedName จะต้องเป็นชื่อแอตทริบิวต์ JSON ที่ถูกต้อง