2011-10-04 17 views
34

मैं जैक्सन का उपयोग कर JSON पेड़ से नोड नाम कैसे प्राप्त कर सकता हूं? JSON फ़ाइल इस तरह दिखता है:जैक्सन जेएसओएन: जेसन-पेड़ से नोड नाम प्राप्त करें

{ 
    node1:"value1", 
    node2:"value2", 
    node3:{ 
     node3.1:"value3.1", 
     node3.2:"value3.2" 
    } 
} 

मैं

JsonNode rootNode = mapper.readTree(fileReader); 

है और तरह

for (JsonNode node : rootNode){ 
    if (node.getName().equals("foo"){ 
     //bar 
    } 
} 

धन्यवाद कुछ की जरूरत है।

उत्तर

46

यह उत्तर 2+ से पहले जैक्सन संस्करणों पर लागू होता है (मूल रूप से 1.8 के लिए लिखा गया)। जैक्सन के नए संस्करणों के साथ काम करने वाले संस्करण के लिए @SupunSameera's answer देखें।


"नोड नाम" के लिए JSON शब्द "कुंजी" है। चूंकि JsonNode#iterator() चाबियाँ शामिल नहीं है, तो आप differently पुनरावृति करने की जरूरत है:

for (Map.Entry<String, JsonNode> elt : rootNode.fields()) 
{ 
    if ("foo".equals(elt.getKey())) 
    { 
     // bar 
    } 
} 

यदि आप केवल कुंजी देखने की जरूरत है, तो आप JsonNode#fieldNames() साथ एक सा बातें आसान बनाने में कर सकते हैं:

for (String key : rootNode.fieldNames()) 
{ 
    if ("foo".equals(key)) 
    { 
     // bar 
    } 
} 

और यदि आप केवल "foo" के साथ नोड खोजना चाहते हैं, तो आप access it directly कर सकते हैं। यह एक पाश का उपयोग कर की तुलना में बेहतर प्रदर्शन (निरंतर समय देखने) और क्लीनर/साफ कोड निकलेगा:

JsonNode foo = rootNode.get("foo"); 
if (foo != null) 
{ 
    // frob that widget 
} 
+10

यह() के रूप में यद्यपि 'getFields लग रहा है'() 'जैक्सन 2.0.0 में' क्षेत्रों के लिए बदल दिया है। –

+1

'स्ट्रिंग कुंजी के माध्यम से Iterating: rootNode.fieldNames() 'मुझे' देता है 'केवल सरणी या java.lang.Iterable' त्रुटि का उदाहरण हो सकता है। कोई उपाय? –

+3

वास्तव में 'Map.Entry <स्ट्रिंग, जेसन नोड> प्रविष्टि के माध्यम से पुनरावृत्ति: rootNode।फ़ील्ड्स() 'मेरे लिए भी एक ही त्रुटि देता है –

48

जैक्सन 2 + के लिए (com.fasterxml.jackson), विधियों थोड़ा अलग हैं:

Iterator<Entry<String, JsonNode>> nodes = rootNode.get("foo").fields(); 

while (nodes.hasNext()) { 
    Map.Entry<String, JsonNode> entry = (Map.Entry<String, JsonNode>) nodes.next(); 

    logger.info("key --> " + entry.getKey() + " value-->" + entry.getValue()); 
} 
+0

यह केवल कुछ नोड्स को पुन: सक्रिय करता है। मैं कुछ नोड्स छोड़ दिया जा रहा हूँ। – Kieveli

6

फ़ील्ड्स() और फील्ड नाम() दोनों मेरे लिए काम नहीं कर रहे थे। और मुझे चाबियों पर फिर से चलाने के लिए रास्ता खोजने के लिए काफी समय व्यतीत करना पड़ा। दो तरीके हैं जिनसे इसे किया जा सकता है।

एक यह एक नक्शे में परिवर्तित करने के द्वारा होता है (अधिक स्थान लेता है):

Iterator<String> it = jsonNode.getFieldNames(); 
while (it.hasNext()) 
{ 
    String key = it.next(); 
    if (key.equals(foo)) 
    { 
     //code here 
    } 
} 
+0

यह एकमात्र चीज थी जो मेरे लिए काम करती थी, अन्य सभी सुझाव अनंत लूप का कारण बनते थे। – ampofila

+0

मैं दिखाता हूं कि getFieldNames() फ़ील्ड नाम() होना चाहिए। – Switch

1

स्पष्टीकरण यहाँ:

इस जबकि

ObjectMapper mapper = new ObjectMapper(); 
Map<String, Object> result = mapper.convertValue(jsonNode, Map.class); 
for (String key : result.keySet()) 
{ 
    if(key.equals(foo)) 
    { 
     //code here 
    } 
} 

एक और, एक स्ट्रिंग इटरेटर का उपयोग करके काम करेगा:

JsonNode rootNode = objectMapper.readTree(file); 
Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields(); 
while (fields.hasNext()) { 
    Map.Entry<String, JsonNode> entry = fields.next(); 
    log.info(entry.getKey() + ":" + entry.getValue()) 
} 

यह कार्य नहीं करेंगे:

JsonNode rootNode = objectMapper.readTree(file); 

while (rootNode.fields().hasNext()) { 
    Map.Entry<String, JsonNode> entry = rootNode.fields().next(); 
    log.info(entry.getKey() + ":" + entry.getValue()) 
} 

तो एक चर के रूप में Iterator घोषित करने के लिए सावधान रहना होगा और उसका उपयोग

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