2013-02-21 38 views
10

मेरे पास एक JSON स्ट्रिंग है जहां न तो कुंजी और न ही मान उद्धृत किए गए हैं और मैं इसे सही रूप से स्वरूपित JSON में बदलना चाहता हूं।अनगिनत JSON स्ट्रिंग को पार्स करने के लिए कैसे करें

{basic:{0:{index:0, license:t, nameSID:n, image:"img_left", descriptionSID:t, category:r}} 

क्या कोई जावा लाइब्रेरी है जो इसे संभाल सकती है? मैंने Jackson की कोशिश की लेकिन यह काम नहीं करता है।

संबंध है, जनवरी

उत्तर

4

आप जैक्सन के साथ JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES उपयोग कर सकते हैं गैर उद्धृत फ़ील्ड नाम अनुमति देने के लिए:

JsonFactory factory = new JsonFactory(); 
factory.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); 
JsonParser jp = factory.createJsonParser(new FileInputStream("content.json")); 
+2

मैंने इसका उपयोग किया लेकिन यह अनगिनत मूल्यों के लिए या अनगिनत संख्यात्मक कुंजी (जैसे "0: myValue") – Jan

+1

के लिए "लाइसेंस" के लिए मदद नहीं करेगा: "एक, दो" 'लाइसेंस के रूप में विकृत: एक, दो 'आप व्याख्या का चयन करने का सुझाव कैसे देते हैं? मुझे लगता है कि आपको अपना खुद का deserializer लिखना होगा। जैक्सन की 'ऑब्जेक्टमैपर' और 'मॉड्यूल' कार्यक्षमता आपकी मदद कर सकती है। – ipavlic

+0

मेरे मामले में, मुझे पता है कि मेरे पास मूल्यों के बिना 'स्ट्रिंग' होगा। लेकिन हाँ, ऐसा लगता है कि मुझे अपना खुद का पार्सर लिखना होगा। – Jan

0

में सुनिश्चित नहीं हैं, जिसके आप स्वामी पार्सर या नहीं लिखने के लिए चारों ओर है, लेकिन मैंने किया था।

https://github.com/ischumacher/rsjp

यहाँ अपने उदाहरण के साथ उदाहरण के उपयोग है JSON:

{ 
    basic: 
    { 
     0: 
     { 
     index: 0, 
     license: t, 
     nameSID: n, 
     image: img_left, 
     descriptionSID: t, 
     category: r 
     } 
    } 
} 

img_left 
0

मैं कैसे एक जैक्सन से निपटने के लिए अनुकूलित करने के बारे जा सकता में देखा:

String str = "{basic:{0:{index:0, license:t, nameSID:n, image:\"img_left\", descriptionSID:t, category:r}}"; 
Map<String, Object> jso = Json.parseJSON(str); 
System.out.println(jso); 
System.out.println(Json.get(jso, "basic", "0", "image")); 

यहाँ उत्पादन होता है गैर-उद्धृत फ़ील्ड मान (बनाम फ़ील्ड नाम)। भले ही मैं एक हैक लिखने के बाद समाप्त हो गया, मैं दूसरों के लिए यहां अपने ब्रेडक्रंब निशान पोस्ट कर रहा हूं। जैक्सन 2.7.2 में मेरा कोड स्पेलंकिंग किया गया था।

जैक्सन कोर JsonParser इंटरफेस के दो ठोस कार्यान्वयन के साथ आता है:

  • ReaderBasedJsonParser, चरित्र धाराओं के लिए एक पार्सर (एन्कोडिंग स्वतंत्र)
  • UTF8StreamJsonParser, एक पार्सर UTF-8 बाइट के लिए अनुकूलित धाराओं

इन दो वर्गों में कोड काफी अनावश्यक है, संभवतः आवश्यकता से बाहर है। प्रत्येक वर्ग में एक विधि होती है जिसे अगली टोकन() द्वारा बुलाया जाता है जब एक अप्रत्याशित चरित्र का सामना किया जाता है। ReaderBasedJsonParser का नाम _handleOddValue() और UTF8StreamJsonParser है _handleUnexpectedValue()। एक संख्यात्मक मान के रूप में "NaN" को स्वीकार करने की तरह सामग्री और सिंगल-उद्धृत स्ट्रिंग मानों को यहां होने की अनुमति देता है।

मेरी योजना (इससे पहले कि मैं अपनी इंद्रियों में आया और महसूस किया कि मेरी अल्पकालिक जरूरतों के लिए एक भयानक हैक पर्याप्त होगा) इन पार्सर्स में से एक/दोनों को उप-वर्ग करना था और बिना छेड़छाड़ वाले स्ट्रिंग मानों को संभालने के लिए ऊपर दिए गए तरीकों को ओवरराइड करना था। चूंकि इस विधि को तब कहा जाता है जब इनपुट स्ट्रीम फ़ील्ड मान (केवल कोलन को पहचानने के बाद) के संदर्भ में होती है, तब तक इसे पढ़ना संभव होना चाहिए जब तक कि कॉमा या दाएं घुंघराले ब्रेस का सामना न हो और उस बिंदु को पढ़ने के लिए सबकुछ गिनें एक स्ट्रिंग मान। यह कोड लिखना मुश्किल है क्योंकि इसे जैक्सन की बफरिंग रणनीति की समझ की आवश्यकता है, पार्सर का आर्किटेक्चर (वर्तमान बफर में वर्तमान सूचक एक आवृत्ति चर है), आदि

ऑब्जेक्ट मैपर बनाने के लिए इस कस्टम पार्सर का उपयोग करें, एक को अवश्य ही subclass JsonFactory और _createParser() विधि को ओवरराइड करें जो इसे तुरंत चालू करता है। नियमित और यूटीएफ -8 पार्सर दोनों को सही तरीके से काम करने के लिए और अधिक काम की आवश्यकता हो सकती है, हालांकि प्रदर्शन की चिंता नहीं होने पर नियमित पार्सर के उपयोग को मजबूर करना पर्याप्त है। फिर, इस कस्टम जेसनफ़ैक्टरी का एक उदाहरण ऑब्जेक्टमैपर के कन्स्ट्रक्टर में पास किया जा सकता है।

उम्मीद है कि यह किसी की मदद करेगा।

संबंधित मुद्दे