2011-11-20 7 views
9

का उपयोग कर JSON सरणी से स्ट्रिंग पुनर्प्राप्त करें मुझे कई उत्तरों मिल गए हैं जो मैं करने की कोशिश कर रहा हूं, लेकिन पर्याप्त नहीं है कि मैं इसे काम करने में सक्षम हूं। मेरे पास JSON का एक गुच्छा है जो इस उदाहरण की तरह दिखता है (केवल वास्तव में कई स्तरों को गहरा और स्तर पर सैकड़ों आइटमों के साथ मैं एक्सेस करना चाहता हूं): {"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}। मैं प्रारूप नहीं बदल सकता; यह किसी और का एपीआई है। इसमें बहुत कुछ है जिसकी मुझे आवश्यकता नहीं है; असल में मैं केवल ["बोब्सियरुनकल", "easyaspie"] की एक सरणी की तरह कुछ चाहता हूं। (या एक सूची या जो भी हो।)जैक्सन

मैंने जेएसओएन के एक सरल संस्करण के साथ प्रयोग किया जिसमें एक सरणी नहीं थी, और rootNode.get ("query") का उपयोग करके आसानी से एक स्ट्रिंग तक पहुंचने में सक्षम था। ("पेज") ... https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608 में वर्णित तरीका। लेकिन मैं इस तरह से सरणी में नहीं पहुंच पाया है। मुझे यहां मिले अधिकांश उत्तरों का मानना ​​है कि मैं "लिंक" जैसे पीओजेओ बनाना चाहता हूं जिसमें "शब्द" और "कोड" दोनों शामिल हैं, जो मैं नहीं करता हूं। स्ट्रिंग्स को एक्सेस करने के लिए, क्या "लिंक" की सूची की तरह कुछ बनाना आवश्यक है जिसमें "शब्द" और "कोड" दोनों शामिल हैं और फिर "कोड" को अनदेखा करें? यह सही प्रतीत नहीं होता है।

(इसके अलावा, अगर किसी को भी मुझे प्रलेखन को इंगित कर सकता/कहीं JacksonInFiveMinutes ट्यूटोरियल और पूरे जावाडोक के बीच में ट्यूटोरियल, मुझे यकीन है कि वह भी मदद मिलेगी हूँ।)

ईटीए इस काम किया, मुझे लगता है कि !:

  String theJsonString = "{\"query\":{\"pages\":{\"links\":" 
       + "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode rootNode = mapper.readTree(theJsonString); 
     JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links"); 
     for (int i = 0; i < interestingObjectNode.size(); i ++) { 
      System.out.println(interestingObjectNode.get(i).path("word").asText()); 
     } 

उत्तर

7

शायद यह ब्लॉग प्रविष्टि मदद कर सकता है: Traversing JSON trees with Jackson?

मुझे यकीन नहीं है कि आपके पास कौन सी सटीक समस्या है, लेकिन ध्यान देने योग्य एक बात यह है कि JSON Arrays प्रविष्टि की अनुक्रमणिका उत्तीर्ण करके नाम नहीं है, नाम नहीं। इसलिए जबकि आप objectNode.get("key") का उपयोग करेंगे, तो आप इसके बजाय arrayNode.get(0) का उपयोग करें। या, यदि आप सुरक्षित खेलना चाहते हैं और "अनुपलब्ध" प्रविष्टियों को अनुमति देना चाहते हैं, तो arrayNode.path(0) (और जेएसओएन ऑब्जेक्ट्स के लिए डिट्टो) का उपयोग करें।

यह भी याद रखें कि आप JSON पेड़ (JsonNode) और पीओजेओ के बीच वापस जा सकते हैं; ObjectMapper में प्रस्तुतियों के बीच कनवर्ट करने के लिए कई विधियां हैं (कनवर्ट करें(), readAsTree(), treeToValue(), valueToTree())। इसलिए कुछ हिस्सों के लिए डेटा बाध्यकारी, दूसरों के लिए पेड़ मॉडल का उपयोग करना संभव है; कभी-कभी पीओजेओ के रूप में बाध्यकारी उप-पेड़, अन्य बार केवल डेटा-बाइंडिंग उच्च-स्तर और पेड़ मॉडल का उपयोग करके उप-पेड़ तक पहुंचते हैं। यह चीजों को करने का एक बहुत ही शक्तिशाली तरीका है, लेकिन इसका उपयोग करने में थोड़ी देर लगती है।

आशा है कि इससे मदद मिलती है!

+0

मेरी पिछली टिप्पणी हटा दी गई - मैं अंत में वहां गया, अगर कोई इस प्रश्न को पाता है तो ऊपर कुछ कोड डालें। – umbraphile

+0

सुरक्षित? उस जैक्सन उपयोग में "सुरक्षित" से आपका क्या मतलब है? @StaxMan – gumuruh

+0

सुरक्षित अर्थ यह है कि यदि आप 'प्राप्त' का उपयोग करते हैं, और कोई मिलान नोड नहीं है, तो यह शून्य हो जाता है, और जांच की जानी चाहिए। लेकिन 'पथ' के साथ, एक वर्चुअल "लापता नोड" वापस कर दिया जाता है, इसलिए कोई शून्य जांच की आवश्यकता नहीं होती है। – StaxMan

0

Google के जीएसओएन में यदि आप कोई पीओजेओ बनाते हैं जिसमें कुछ गुणों की कमी है, तो अनुरूप जेएसओएन को नजरअंदाज कर दिया जाता है। यह केवल उन्हीं गुणों को पॉप्युलेट करता है जिनके मिलान नाम हैं। इस तरह एक वर्ग क्यों नहीं बना:

Query{ 
Pages{ 
Word[] Links; 
} 
} 

Word{ 
String word; 
String code; 
} 

और फिर LambdaJ का उपयोग शब्द पाने के लिए सभी छोरों लेखन से बचने के लिए?

हैं कि आकर्षक लग here नहीं है और दस्तावेज़ के

बहुत सारे वहाँ बाहर डेटाबेस MongoDB और RavenDB आदि जैसे JSONPath

कोशिश भंडारण के लिए उनके प्रारूप के रूप में JSON का उपयोग करें। जटिल जेएसओएन क्वेरी इन्हें बनाया गया है, वे उसी पुस्तकालयों का उपयोग करें जिनका वे उपयोग कर रहे हैं।

+1

नकारात्मक टिप्पणी क्यों दे रहे हैं इसके साथ एक टिप्पणी छोड़ दो? यदि यह कोड है - यह स्पष्ट रूप से एक छद्म कोड है जो विभिन्न पीओजेओ वर्गों की संरचना को समझाता है। – Zasz

+0

मूल प्रश्न से संकेत मिलता है कि पीओजेओ परिभाषाओं का उपयोग वांछित नहीं था, इसलिए शायद यह सुझाव देने के लिए शब्द सुधारना होगा कि उसके दृष्टिकोण के बजाय, अभी भी डेटा बाइंडिंग पर विचार करें?(जैक्सन बनाम जीसन का उपयोग करने के लिए डिट्टो) – StaxMan