2012-02-28 14 views
13

मैं एक JSON प्रतिक्रिया जो ऐसा दिखाई देता है। इसलिए, मुझे इन सभी पैरामीटर को java.util.Map फ़ील्ड में < "paramX", "valueX"> tuples से जोड़ना है और इन्हें बांधना है। ऐसा करने के लिए, मैंने निम्न कोड को आजमाया लेकिन "पैरामीटर मैप" फ़ील्ड शून्य लौटाता है।JAXB java.util.Map बाध्यकारी

@XmlRootElement(name="data") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Parameters { 
    @XmlElement 
    private Map<String,String> parametersMap; 

    // Getter and setter for parametersMap 
} 

मैं जेएक्सबी एनोटेशन के साथ इस तरह के बाध्यकारी कैसे प्राप्त कर सकता हूं?

अग्रिम धन्यवाद।

+0

एक अलग पोस्ट से मैंने अभी सीखा है कि * जर्सी * (पुनः) * जेएक्सबी * एनोटेशन का उपयोग करता है। http://stackoverflow.com/questions/1261593/binding-a-json-to-a-java-class-using-jaxb –

+1

हां, जेएक्सबी एक्सएमएल बाइंडिंग के लिए है लेकिन इसका उपयोग जावा ऑब्जेक्ट्स में JSON इनपुट को बाध्य करने के लिए भी किया जा सकता है जर्सी के साथ मिलकर। – ovunccetin

+0

एक्लिप्ससेंक जेएक्सबी (MOXy) जेएसओएन बाध्यकारी जेएक्सबी एनोटेशन का लाभ उठाने की पेशकश भी करता है: http://blog.bdoughan.com/2011/08/json-binding-with-eclipselink-moxy.html –

उत्तर

7

असल में आपको एक एक्सएमएल एडाप्टर की आवश्यकता है। आप जिस विशिष्ट आउटपुट को चाहते हैं उसे प्राप्त करने के लिए आप KeyValue क्लास के नामों के साथ बेवकूफ़ बना सकते हैं।

Parameter.java

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 
import java.util.Map; 

@XmlRootElement(name = "data") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Parameters { 

    @XmlJavaTypeAdapter(value = Adapter.class) 
    private Map<String, String> parametersMap; 

    // Getter and setter for parametersMap 
} 

Adapter.java

import javax.xml.bind.annotation.adapters.XmlAdapter; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import java.util.Set; 

public class Adapter extends XmlAdapter<List<KeyValue>, Map<String, String>> { 

    @Override 
    public Map<String, String> unmarshal(List<KeyValue> v) throws Exception { 
     Map<String, String> map = new HashMap<>(v.size()); 
     for (KeyValue keyValue : v) { 
      map.put(keyValue.key, keyValue.value); 
     } 
     return map; 
    } 

    @Override 
    public List<KeyValue> marshal(Map<String, String> v) throws Exception { 
     Set<String> keys = v.keySet(); 
     List<KeyValue> results = new ArrayList<>(v.size()); 
     for (String key : keys) { 
      results.add(new KeyValue(key, v.get(key))); 
     } 
     return results; 
    } 
} 

KeyValue.java बेहतर JAXB टैग यहाँ रखो, जाहिर है।

import javax.xml.bind.annotation.XmlType; 

@XmlType 
public class KeyValue { 
    public KeyValue() { 
    } 

    public KeyValue(String key, String value) { 
     this.key = key; 
     this.value = value; 
    } 

    //obviously needs setters/getters 
    String key; 
    String value; 
} 
+0

मुझे 'com.sun.xml.bind.v2.runtime.IleglegalnnnationsException:' पैरामीटर.जावा 'के लिए अवैध' अज्ञात अभिव्यक्ति 'की 1 गिनती है जहां' मानचित्र 'घोषित किया गया है। – koppor

+1

उत्तर https://www.tomasmalmsten.com/2012/05/unmarshall-marshall-java-maps-xml-jaxb/ wraps 'सूची ' एक और सहायक वर्ग में। यह 'अवैध अज्ञात अपवाद' को रोकता है। – koppor

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