แจ็คสันกับ Gson [ปิด]


363

หลังจากค้นหาไลบรารีที่มีอยู่สำหรับ JSON แล้วฉันก็พบกับสองสิ่งนี้:

  • แจ็คสัน
  • Google GSon

ฉันเป็นเพียงเล็กน้อยต่อ GSON แต่คำในเน็ตคือ GSon ทนทุกข์ทรมานจากปัญหาประสิทธิภาพท้องฟ้าบางอย่าง(ณ เดือนกันยายน 2009)

ฉันทำการเปรียบเทียบต่อไป ในระหว่างนี้ฉันกำลังมองหาความช่วยเหลือในการตัดสินใจ


3
นอกจากนี้สำหรับการใช้งาน Android เกณฑ์มาตรฐานประสิทธิภาพล่าสุดที่ฉันได้เห็นคือ: martinadamek.com/2011/02/04/ …
StaxMan


7
หมายเหตุสั้น ๆ อย่างหนึ่ง: ผู้ที่เลือก GSon ควรแน่ใจว่าใช้ 2.1 - ประสิทธิภาพการทำงานนั้นดีกว่ารุ่นก่อน ๆ
StaxMan

46
ด้วยคะแนนสูงสุด 74 คะแนนในตอนนี้คำถามนี้จึงมีคำตอบที่มีค่า คำตอบที่ดีทรัมป์คำถาม "ไม่สร้างสรรค์" การลงคะแนนเพื่อเปิดใหม่
นิโคลัส

1
เอกสารของแจ็กสันเริ่มซับซ้อนขึ้นอย่างน่าขัน . .
dongshengcn

คำตอบ:


117

ฉันทำวิจัยนี้เมื่อสัปดาห์ที่แล้วและลงเอยด้วยห้องสมุด 2 แห่ง ขณะที่ฉันใช้ Spring 3 (ซึ่งใช้แจ็กสันในมุมมอง Json ที่เป็นค่าเริ่มต้น ' JacksonJsonView ') มันเป็นเรื่องธรรมดามากที่ฉันจะทำแบบเดียวกัน 2 lib นั้นเหมือนกันมาก ... ในตอนท้ายพวกเขาเพียงจับคู่กับไฟล์ json! :)

อย่างไรก็ตามอย่างที่คุณพูดแจ็คสันมีการแสดง + และนั่นสำคัญมากสำหรับฉัน โครงการนี้ค่อนข้างแอคทีฟอย่างที่คุณเห็นจากหน้าเว็บของพวกเขาและนั่นก็เป็นสัญญาณที่ดีเช่นกัน


2
นอกจากนี้ Google GSon ยังไม่สนับสนุนการอ้างอิงแบบวงกลม แจ็คสันจัดการกับพวกเขาหรือไม่?
กุยโด

1
สนับสนุนการอ้างอิงแบบวงกลม ... ที่ควรจะเป็นคุณสมบัติหลัก แต่ฉันไม่แน่ใจว่ามันจะสนับสนุนพวกเขาฉันไม่เคยพบการอ้างอิงแบบวงกลมมาก่อน (แม้ว่าพวกเขาจะค่อนข้างธรรมดาฉันคิดว่าโดยเฉพาะในแบบจำลอง) . นี่คือมาตรฐานอื่นที่สามารถเน้นความรวดเร็วของแจ็คสันเมื่อเทียบกับ GSon ดูเหมือนว่าจะเร็วกว่า 100 เท่าในการทำให้เป็นอนุกรม / การ
ลดความน่าเชื่อถือ

1
แจ็กสันไม่จัดการอ้างอิงวงกลมในปัจจุบัน หากเป็นสิ่งสำคัญ XStream จะทำเช่นนั้น ไม่แน่ใจว่าแพคเกจ json ดั้งเดิมใด ๆ (อาจเป็นแบบ
ยืดหยุ่น -sonson

11
ในฐานะรุ่นที่ 1.6 Jackson สนับสนุนการอ้างอิงแบบวงกลม ดูจัดการการอ้างอิงแบบสองทิศทางโดยใช้วิธีการที่เปิดเผยสำหรับการอ้างอิง
Ophir Radnitz

แจ็กสันมีปัญหาด้านความปลอดภัยมากขึ้นพร้อมที่จะเสริม
ทัพ

83

Jackson และ Gson เป็นแพคเกจ Java JSON ที่สมบูรณ์แบบที่สุดเกี่ยวกับการสนับสนุนการเชื่อมโยงข้อมูลจริง แพคเกจอื่น ๆ อีกมากมายให้เฉพาะการผูกแผนที่ / รายการ (หรือโมเดลต้นไม้ที่เทียบเท่า) ทั้งสองประเภทมีการรองรับประเภททั่วไปอย่างสมบูรณ์รวมถึงความสามารถในการกำหนดค่าที่เพียงพอสำหรับกรณีการใช้งานทั่วไปจำนวนมาก

เนื่องจากฉันคุ้นเคยกับแจ็กสันมากขึ้นนี่คือแง่มุมที่ฉันคิดว่าแจ็คสันมีการสนับสนุนที่สมบูรณ์กว่า Gson (ขอโทษถ้าฉันพลาดฟีเจอร์ Gson):

  • การสนับสนุนคำอธิบายประกอบอย่างกว้างขวาง รวมถึงการสืบทอดแบบเต็มและการเพิ่มความคิดเห็น "การผสม" ขั้นสูง (เชื่อมโยงคำอธิบายประกอบกับคลาสสำหรับกรณีที่คุณไม่สามารถเพิ่มได้โดยตรง)
  • กรณีการสตรีม (เพิ่มขึ้น) การอ่านการเขียนสำหรับกรณีการใช้งานประสิทธิภาพสูงพิเศษ (หรือหน่วยความจำ จำกัด ) สามารถผสมกับการผูกข้อมูล (ผูกต้นไม้ย่อย) - แก้ไข : Gson รุ่นล่าสุดยังมีเครื่องอ่านสตรีม
  • ทรีโมเดล (เข้าถึง DOM- เหมือน); สามารถแปลงระหว่างรุ่นต่างๆ (ต้นไม้ <-> สตรีมวัตถุ Java <->)
  • สามารถใช้ตัวสร้างใด ๆ (หรือวิธีการคงที่จากโรงงาน) ไม่เพียง แต่ตัวสร้างเริ่มต้น
  • การเข้าถึง Field และ getter / setter (รุ่น gson รุ่นก่อนหน้านี้ใช้เฉพาะฟิลด์ซึ่งอาจมีการเปลี่ยนแปลง)
  • รองรับ JAX-RS นอกกรอบ
  • การทำงานร่วมกัน: ยังสามารถใช้คำอธิบายประกอบ JAXB, มีการสนับสนุน / การทำงานรอบ ๆ สำหรับแพคเกจทั่วไป (joda, ibatis, cglib), ภาษา JVM (Groovy, Clojure, สกาล่า)
  • ความสามารถในการบังคับใช้การจัดการประเภทคงที่ (ประกาศ) สำหรับการส่งออก
  • รองรับ deserializing ประเภท polymorphic (Jackson 1.5) - สามารถทำให้เป็นอนุกรมและ deserialize สิ่งต่าง ๆ เช่น List อย่างถูกต้อง (พร้อมกับข้อมูลประเภทเพิ่มเติม)
  • การสนับสนุนแบบบูรณาการสำหรับเนื้อหาไบนารี (base64 ถึง / จาก JSON Strings)

6
จริงๆแล้วโพสต์นี้ - cowtowncoder.com/blog/archives/2010/11/entry_434.html - สรุปคุณสมบัติต่างๆของแจ็คสันที่ไม่พบในแพ็คเกจอื่น ๆ
StaxMan

12
ฉันจะพิจารณาว่าไม่ต้องการให้คำอธิบายประกอบเป็นคุณลักษณะของ GSON ไม่ใช่ข้อบกพร่อง (ซึ่งคุณระบุไว้อย่างน้อย 3 ครั้งด้านบน)
orbfish

6
ทั้ง Jackson และ Gson ไม่จำเป็นต้องใช้คำอธิบายประกอบ แต่การมีคำอธิบายประกอบเป็นตัวเลือกเป็นคุณสมบัติที่มีค่าในของฉัน Verifyinion (esp. "คำอธิบายประกอบแบบผสม" ซึ่งเป็นตัวเลือกการประมวลผลเพิ่มเติมเพื่อให้เชื่อมโยงการกำหนดค่าภายนอก)
StaxMan

3
Gson ช่วยให้คุณสามารถลงทะเบียน InstanceCreator เพื่อระบุวิธีอื่นในการสร้างอินสแตนซ์แทนที่จะใช้ตัวสร้างเริ่มต้น
ภายใน

37

ตอนนี้ Gson 1.6 มี API สตรีมมิ่งระดับต่ำและ parser ใหม่ซึ่งเร็วกว่า Jackson จริง ๆ


ฉันสนใจที่จะเห็นการวัดที่สนับสนุนสิ่งนี้ การวัดอย่างน้อยที่: wiki.fasterxml.com/JacksonInFiveMinutesยังระบุว่า GSON ไม่สามารถแข่งขันกับแพ็คเกจ Java json อื่น ๆ ได้
StaxMan

1
เรามีมาตรฐานขนาดเล็ก (ตรวจสอบในที่เก็บข้อมูลการโค่นล้ม Gson ภายใต้ไดเรกทอรี trunk / ตัวชี้วัด) ที่แสดงว่าในการแปลงวัตถุอย่างง่าย API การสตรีมระดับต่ำอาจเร็วกว่าถึง 10 เท่า มีเกณฑ์มาตรฐานอื่น ๆ ด้วย (ซึ่งฉันต้องการสนับสนุนให้ผู้แต่งดั้งเดิมตีพิมพ์) ว่า API ระดับต่ำนี้จะเต้นในห้องสมุดอื่น ๆ รวมถึงแจ็คสันด้วย อย่างไรก็ตามการสร้างเกณฑ์มาตรฐานที่ครอบคลุมและเป็นตัวแทนจะใช้เวลาและความพยายาม
ภายใน

3
อีกจุดข้อมูลหนึ่ง: jvm-serializers ( github.com/eishay/jvm-serializers ) ตอนนี้มีการทดสอบ "gson / manual" ซึ่งใช้ GSON สตรีม API เป็นทางเลือกในการผูกข้อมูล เมื่อผู้เขียนเรียกใช้หมายเลข 'เป็นทางการ' วิกิสามารถอัปเดต แต่จากการใช้งานในพื้นที่นี้ฉันไม่คิดว่ามันจะสนับสนุนการแถลงอย่างรวดเร็ว
StaxMan

12
(นอกเหนือจากข้างต้น: รวมตัวเลขอย่างเป็นทางการแล้ว - การสตรีม Gson เร็วกว่าการรวบรวมข้อมูล แต่ไม่ถึงระดับประสิทธิภาพของแจ็คสัน)
StaxMan

9
... สำหรับทุกคนที่ติดตาม Gson 2.1 ในที่สุดก็มีการปรับปรุงประสิทธิภาพที่สำคัญและสามารถวัดได้
StaxMan

13

เพิ่มไปยังคำตอบอื่น ๆ ที่ได้รับด้านบน หากการไม่คำนึงถึงขนาดตัวพิมพ์เป็นเรื่องสำคัญสำหรับคุณให้ใช้แจ็คสัน Gson ไม่สนับสนุนการคำนึงถึงขนาดตัวพิมพ์ของชื่อคีย์ขณะที่แจ็คสันทำ

นี่คือลิงก์ที่เกี่ยวข้องสองรายการ

(ไม่) การสนับสนุนตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ใน Gson: GSON: วิธีรับองค์ประกอบแบบตัวเล็กตัวพิมพ์เล็กจาก Json ได้อย่างไร

รองรับการใช้ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ใน Jackson https://gist.github.com/electrum/1260489


ข้อมูลสำหรับการสนับสนุนกรณีความไวในแจ็คสันไม่ได้ทำงาน หรือใช้สำหรับคุณสมบัติระดับบนสุดเท่านั้น ลองวางคุณสมบัติและคุณจะเห็นวิธีแก้ปัญหาของคุณไม่ทำงาน
Andres F.

1
จริงๆแล้วมีการสนับสนุนอย่างเป็นทางการสำหรับคุณสมบัติที่คำนึงถึงขนาดตัวพิมพ์MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIESซึ่งเพิ่มใน Jackson 2.5 ดังนั้นไม่จำเป็นต้องเพิ่มรหัสที่กำหนดเองสำหรับสิ่งนั้น
StaxMan

6

ดูเหมือนว่า GSon จะไม่รองรับ JAXB โดยการใช้คลาสที่มีคำอธิบายประกอบ JAXB เพื่อสร้างหรือประมวลผลข้อความ JSON ฉันสามารถแบ่งปันคลาสเดียวกันเพื่อสร้างส่วนติดต่อผู้ใช้บริการเว็บของ Restful โดยใช้ spring MVC


หากคุณมีคำอธิบายประกอบในคลาสข้อมูลของไฮเบอร์เนตคุณไม่ต้องการชุดอื่นสำหรับ JAXB
orbfish

1
ยินดีที่ได้เพิ่มการสนับสนุนสำหรับคำอธิบายประกอบ "foreign" แจ็คสันมีโมดูลคำอธิบายประกอบ JAXB ซึ่งเป็นตัวเลือกรวมถึงโมดูลไฮเบอร์เนตสำหรับคำอธิบายประกอบสองชุด อาจขยาย Gson เพื่ออนุญาตส่วนขยายแบบแยกส่วนได้เช่นกัน
StaxMan

2
โดยเฉพาะอย่างยิ่ง JAXB เป็นมาตรฐาน!
maxxyme
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.