जैक्सन बनाम। Gson [बंद]


363

JSON के लिए कुछ मौजूदा पुस्तकालयों के माध्यम से खोज करने के बाद, मैंने आखिरकार इन दोनों को समाप्त कर दिया है:

  • जैक्सन
  • Google GSON

मैं GSON की ओर थोड़ा आंशिक हूं, लेकिन नेट पर शब्द है कि GSon एक निश्चित खगोलीय प्रदर्शन के मुद्दे (सितंबर 2009 तक) से ग्रस्त है ।

मैं अपनी तुलना जारी रख रहा हूं; इस बीच, मैं अपना मन बनाने के लिए मदद की तलाश कर रहा हूं।


3
इसके अलावा, एंड्रॉइड उपयोग के लिए, नवीनतम प्रदर्शन बेंचमार्क मैंने देखा है यह है: martinadamek.com/2011/02/04/…
StaxMan


7
एक त्वरित ध्यान दें: किसी को भी जीएसओएन चुनने के लिए 2.1 का उपयोग करना सुनिश्चित करना चाहिए - इसका प्रदर्शन अंततः पिछले संस्करणों की तुलना में औसत रूप से बेहतर है।
21

46
अब तक के 74 वोटों के साथ, इस सवाल के स्पष्ट रूप से कुछ मूल्यवान जवाब हैं। अच्छा जवाब ट्रम्प "रचनात्मक नहीं" प्रश्न। फिर से मतदान करना।
निकोलस

1
जैक्सन के दस्तावेज अब हास्यास्पद रूप से जटिल हो रहे हैं। । ।
dongshengcn

जवाबों:


117

मैंने पिछले सप्ताह यह शोध किया था और मैं उसी 2 पुस्तकालयों के साथ समाप्त हुआ। जैसा कि मैं स्प्रिंग 3 का उपयोग कर रहा हूं (जो कि जैक्सन को उसके डिफ़ॉल्ट Json दृश्य ' JacksonJsonView ' में अपनाता है ) मेरे लिए भी ऐसा करना अधिक स्वाभाविक था। 2 lib बहुत अधिक समान हैं ... अंत में वे बस एक json फ़ाइल में मैप करते हैं! :)

वैसे भी जैसा कि आपने कहा कि जैक्सन के प्रदर्शन में एक + है और यह मेरे लिए बहुत महत्वपूर्ण है। परियोजना भी काफी सक्रिय है जैसा कि आप उनके वेब पेज से देख सकते हैं और यह एक बहुत अच्छा संकेत भी है।


2
इसके अलावा, Google GSon अभी तक परिपत्र संदर्भों का समर्थन नहीं करता है। क्या जैक्सन उन्हें संभालता है?
गुइडो

1
परिपत्र संदर्भ का समर्थन ... जो कि एक प्राथमिक विशेषता होनी चाहिए, लेकिन मुझे यकीन नहीं है कि अगर यह उनका समर्थन करता है, तो मैंने कभी भी एक परिपत्र संदर्भ का सामना नहीं किया है (भले ही वे काफी सामान्य हों, मुझे लगता है, खासकर मॉडल में) । यहाँ एक और मानदंड है जो यह उजागर कर सकता है कि जैक्सन की तुलना में जैक्सन कितना तेज़ है। यह Serialization / Deserialization code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
mickthompson

1
जैक्सन वर्तमान में परिपत्र संदर्भ नहीं संभालता है। यदि वह महत्वपूर्ण है, तो XStream करता है; यकीन नहीं होता है कि कोई भी देशी
जौन

11
संस्करण 1.6 के रूप में, जैक्सन परिपत्र संदर्भों का समर्थन करता है। संदर्भ के लिए घोषणात्मक विधियों का उपयोग करके द्वि-दिशात्मक संदर्भों को देखें ।
ओफिर रडनिट्ज

जैक्सन के पास अधिक सुरक्षा मुद्दा है, जिसे मजबूत करने के लिए प्रयास करते हुए
ट्यूजर्डोबेलो

83

जैक्सन और गॉन वास्तविक डेटा बाइंडिंग समर्थन के बारे में सबसे पूर्ण जावा JSON पैकेज हैं; कई अन्य पैकेज केवल आदिम नक्शा / सूची (या समकक्ष ट्री मॉडल) बाध्यकारी प्रदान करते हैं। दोनों के पास सामान्य प्रकारों के लिए पूर्ण समर्थन है, साथ ही साथ कई सामान्य उपयोग के मामलों के लिए पर्याप्त विन्यास है।

चूँकि मैं जैक्सन से अधिक परिचित हूँ, यहाँ कुछ पहलू हैं जहाँ मुझे लगता है कि जैक्सन को गन्स की तुलना में अधिक पूर्ण समर्थन है (क्षमा याचना अगर मुझे गेसन सुविधा याद आती है):

  • व्यापक एनोटेशन समर्थन; पूर्ण उत्तराधिकार सहित, और उन्नत "मिक्स-इन" एनोटेशन (उन मामलों के लिए एक वर्ग के साथ संबद्ध एनोटेशन जहां आप उन्हें सीधे नहीं भेज सकते हैं)
  • स्ट्रीमिंग (वृद्धिशील) पढ़ना, लिखना, अल्ट्रा-उच्च प्रदर्शन (या मेमोरी-सीमित) मामलों का उपयोग करने के लिए; डेटा बाइंडिंग के साथ मिश्रण कर सकते हैं (उप-पेड़ों को बांधें) - EDIT : Gson के नवीनतम संस्करणों में स्ट्रीमिंग रीडर भी शामिल हैं
  • ट्री मॉडल (DOM-like access); विभिन्न मॉडलों के बीच परिवर्तित कर सकते हैं (पेड़ <-> जावा वस्तु <-> धारा)
  • किसी भी कंस्ट्रक्टर (या स्टैटिक फैक्ट्री मेथड) का उपयोग कर सकते हैं, न कि केवल डिफॉल्ट कंस्ट्रक्टर
  • फ़ील्ड और गेट्टर / सेटर एक्सेस (पहले के गन्स वर्जन केवल खेतों का उपयोग करते थे, यह बदल सकता है)
  • आउट-ऑफ-द-बॉक्स JAX-RS समर्थन
  • इंटरऑपरेबिलिटी: JAXB एनोटेशन का भी उपयोग कर सकते हैं, कॉमन पैकेज (जोडा, ibatis, cglib) के लिए सपोर्ट / वर्क-अराउंड है, JVM लैंग्वेज (ग्रूवी, क्लोजर, स्कैला)
  • आउटपुट के लिए स्थिर (घोषित) प्रकार की हैंडलिंग के लिए बाध्य करने की क्षमता
  • पॉलीमोर्फिक प्रकार (जैक्सन 1.5) को डीरिशियल करने के लिए समर्थन - सूची और चीजों को सही ढंग से सूचीबद्ध कर सकते हैं (अतिरिक्त प्रकार की जानकारी के साथ)
  • बाइनरी कंटेंट के लिए एकीकृत समर्थन (J64 स्ट्रिंग्स से आधार / के लिए)

6
दरअसल, यह पोस्ट - cowtowncoder.com/blog/archives/2010/11/entry_434.html - जैक्सन की कई विशेषताओं को संक्षेप में प्रस्तुत करता है जो अन्य पैकेजों में नहीं मिलती हैं।
स्टैक्मैन मैन

12
मैं एनोटेशन को जीएसओएन की विशेषता नहीं होने की आवश्यकता मानूंगा, न कि कमी (जिसे आपने कम से कम 3 बार ऊपर सूचीबद्ध किया है)।
orbfish

6
न तो जैक्सन और न ही Gson को एनोटेशन के उपयोग की आवश्यकता है। लेकिन विकल्प के रूप में एनोटेशन होना मेरे ओपिनियन (esp। "मिक्स-इन एनोटेशन" में एक मूल्यवान विशेषता है जो बाहरी कॉन्फ़िगरेशन को जोड़ने के लिए अतिरिक्त प्रसंस्करण विकल्प है)।
स्टेक्समैन

3
Gson आपको एक डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग करने के बजाय एक उदाहरण के निर्माण के लिए एक वैकल्पिक तरीका निर्दिष्ट करने के लिए एक InstanceCreator पंजीकृत करने की अनुमति देता है।
inder

37

Gson 1.6 में अब एक निम्न-स्तरीय स्ट्रीमिंग API और एक नया पार्सर शामिल है जो वास्तव में जैक्सन की तुलना में तेज़ है।


मुझे एक माप देखने में दिलचस्पी होगी जो इसे वापस करता है। कम से कम माप इस पर: wiki.fasterxml.com/JacksonInFiveMinutes अभी भी इंगित करते हैं कि GSON अन्य जावा जॅसन पैकेजों के साथ प्रतिस्पर्धात्मक नहीं है।
स्टैक्मैन मैन

1
हमारे पास माइक्रो-बेंचमार्क उपलब्ध हैं (ट्रंक / मेट्रिक्स डायरेक्टरी के तहत गॉन तोड़फोड़ रिपॉजिटरी में जांचे गए) जो बताते हैं कि साधारण ऑब्जेक्ट रूपांतरण पर, निम्न-स्तरीय स्ट्रीमिंग एपीआई 10x तक तेजी से हो सकता है। अन्य बेंचमार्क भी हैं (जो मुझे प्रकाशित करने के लिए मूल लेखक को प्रोत्साहित करने की आवश्यकता है) कि यह निम्न-स्तरीय एपीआई वर्तमान में जैक्सन सहित अन्य पुस्तकालयों को हरा देता है। हालाँकि, व्यापक और प्रतिनिधि बेंचमार्क बनाने में कुछ समय और प्रयास लगने वाला है।
inder

3
एक और डेटा बिंदु: jvm-serializers ( github.com/eishay/jvm-serializers ) के पास अब "gson / मैन्युअल" टेस्ट है जो डेटा बाइंडिंग के विकल्प के रूप में GSON स्ट्रीमिंग एप का उपयोग करता है। एक बार लेखक 'आधिकारिक' नंबर चलाता है, विकी को अपडेट किया जा सकता है। लेकिन स्थानीय स्तर पर इसे चलाने से, मुझे नहीं लगता कि यह सुपर फास्ट होने के बयानों का समर्थन करता है।
StaxMan

12
(इसके अलावा ऊपर: आधिकारिक नंबर शामिल किए गए थे - स्ट्रीमिंग गॉट डेटाबाइंडिंग की तुलना में तेज़ है, लेकिन जैक्सन के प्रदर्शन के स्तर तक नहीं है)
स्टैक्मैन

9
... ऊपर किसी के लिए भी, Gson 2.1 अंततः महत्वपूर्ण और औसत दर्जे का प्रदर्शन सुधार के साथ आया था।
स्टैक्मैन मैन

13

पहले से ही ऊपर दिए गए अन्य उत्तरों को जोड़ना। यदि आपके लिए असंवेदनशीलता का कोई महत्व नहीं है, तो जैक्सन का उपयोग करें। जैकसन प्रमुख नामों के लिए असंवेदनशीलता का समर्थन नहीं करता है, जबकि जैकसन करता है।

यहां दो संबंधित लिंक दिए गए हैं

(नहीं) गेसन में केस सेंसिटिविटी सपोर्ट: जीएसओएन: जसन से असंवेदनशील तत्व कैसे प्राप्त करें?

जैक्सन https://gist.github.com/electrum/1260489 में केस सेंसिटिविटी सपोर्ट


जैक्सन में केस सेंसिटिविटी सपोर्ट के लिए स्निपेट काम नहीं करता है । या बल्कि, यह केवल शीर्ष-स्तरीय गुणों के लिए काम करता है। एक संपत्ति के घोंसले के शिकार की कोशिश करो और आप देखेंगे कि आपका समाधान काम नहीं करता है।
एंड्रेस एफ।

1
वास्तव में केस-असंवेदनशील गुणों के लिए औपचारिक समर्थन है MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, जैक्सन 2.5 में जोड़ा गया है। तो उसके लिए कस्टम कोड जोड़ने की आवश्यकता नहीं है।
स्टैक्मैन मैन

6

ऐसा लगता है कि GSON JAXB का समर्थन नहीं करता है। JSON संदेश बनाने या संसाधित करने के लिए JAXB एनोटेट वर्ग का उपयोग करके, मैं उसी वर्ग को स्प्रिंग MVC का उपयोग करके रेस्टफुल वेब सेवा इंटरफ़ेस बनाने के लिए साझा कर सकता हूं।


यदि आपके पास पहले से ही हाइबरनेट के लिए अपने डेटा वर्गों पर एनोटेशन हैं, तो आप वैसे भी JAXB के लिए दूसरा सेट नहीं चाहते हैं।
कक्षीय

1
"विदेशी" एनोटेशन के लिए समर्थन जोड़ने में सक्षम होना अच्छा है। जैक्सन में वैकल्पिक JAXB एनोटेशन मॉड्यूल है, साथ ही इसके एनोटेशन (ट्रांज़िएशन, आलसी लोडिंग के लिए) के जोड़े के लिए हाइबरनेट मॉड्यूल है। शायद मॉड्यूलर एक्सटेंशन की अनुमति देने के लिए Gson को बढ़ाया जा सकता है।
स्टैक्मैन मैन

2
विशेष रूप से JAXB एक मानक है!
मैक्सएक्साइम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.