2010-09-29 27 views
11

मैं सूची में किस प्रकार की ऑब्जेक्ट्स निहित है, इस पर निर्भर करता हूं कि मैं रूट सूची तत्व को उपनाम करने में सक्षम होना चाहता हूं। उदाहरण के लिए, यह मेरा वर्तमान आउटपुट है:सूची मूल तत्वों के XStream उपनाम

<list> 
<coin>Gold</coin> 
<coin>Silver</coin> 
<coin>Bronze</coin> 
</list> 

और यही मैं इसे तरह देखने के लिए चाहते हैं: कह रही है सभी सूचियों में एलियास की जानी चाहिए द्वारा

<coins> 
<coin>Gold</coin> 
<coin>Silver</coin> 
<coin>Bronze</coin> 
</coins> 

मैं एक वैश्विक स्तर पर यह कर सकते हैं सिक्के, लेकिन मेरे पास कई अलग-अलग सूचियां हैं और यह काम नहीं करेगी। इसे कैसे करना है इस पर कोई आइडिया? ऐसा लगता है कि यह सरल होना चाहिए, लेकिन निश्चित रूप से, यह नहीं है।

संपादित करें: मुझे निर्दिष्ट करना चाहिए, मैं वस्तुओं को xml में क्रमबद्ध करने की कोशिश कर रहा हूं। मैं अपने वेब ढांचे के रूप में वसंत 3 एमवीसी का उपयोग कर रहा हूँ।

उत्तर

23

चलो कहते हैं कि इस प्रकार आप एक प्रकार विशेषता के साथ एक सिक्का वर्ग करते हैं एनोटेशन। सूची लागू है और सिक्के वर्ग "सिक्के" के रूप में दिखाया जाएगा।

उत्पादन होगा:

<coins> 
    <coin> 
    <type>Gold</type> 
    </coin> 
    <coin> 
    <type>Silver</type> 
    </coin> 
    <coin> 
    <type>Bronze</type> 
    </coin> 
</coins> 

यह वही आप के लिए नहीं कहा है, लेकिन वहाँ एक कारण है।

सबसे पहले, सिक्का में केवल एक विशेषता है, लेकिन हमें यकीन नहीं है कि आप जिस ऑब्जेक्ट को दिखाना चाहते हैं, उसके पास केवल एक विशेषता है। इसलिए, हमें यह बताने की ज़रूरत है कि हम किस ऑब्जेक्ट विशेषता के बारे में बात कर रहे हैं।

आप सिक्का विशेषताओं को एक्सएमएल विशेषताओं के रूप में भी दिखा सकते हैं, फ़ील्ड नहीं। इस प्रकार है:

<coins> 
    <coin type="Gold"/> 
    <coin type="Silver"/> 
    <coin type="Bronze"/> 
</coins> 

आशा है कि यह मदद करता है:

@XStreamAlias("coin") 
public class Coin { 
    @XStreamAsAttribute 
    String type; 

    Coin(String type) { 
     this.type = type; 
    } 
} 

यहाँ उत्पादन होता है।

+0

धन्यवाद, यह दुर्भाग्य से ऐसा करने का एकमात्र तरीका है। एक बेकार रैपर वर्ग बनाना। '#alias (" सिक्के ", सूची .class के लिए कोई विकल्प नहीं है)' (छद्म कोड)। –

5

यह एक आदर्श समाधान है, क्योंकि यह एक अलग आवरण वर्ग की आवश्यकता नहीं है, लेकिन आप कुछ इस तरह कर सकता है: यहाँ

public class CoinResponse { 

    private List<Coin> coinList; 

    public CoinResponse(List<Coin> coinList) { 
     this.coinList = coinList; 
    } 

    public List<Coin> getCoins() { 
     return this.coinList; 
    } 
} 

और बदसूरत हिस्सा है:

List<Coin> coins = Arrays.asList(new Coin(), new Coin(), new Coin()); 
CoinResponse response = new CoinResponse(coins); 

XStream xstream = new XStream(); 
xstream.alias("coins", CoinResponse.class); 
xstream.addImplicitCollection(CoinResponse.class, "coinList"); 

System.out.println(xstream.toXML(response)); 

मूल रूप से, यह Xstream को सिक्का रिस्पॉन्स को परिवर्तित करते समय "सिक्कों" का उपयोग करने के लिए कह रहा है, और फिर सूची के लिए किसी भी नाम का उपयोग न करें।

@XStreamAlias("coin") 
public class Coin { 
    String type; 
} 

और आप एक सिक्के वर्ग कि सिक्का की एक सूची constains है: करने के लिए

@XStreamAlias("coins") 
public class Coins{ 

    @XStreamImplicit 
    List<Coin> coins = new ArrayList<Coin>(); 
} 

वेतन ध्यान

+0

मैंने अभी कुछ देखा है। यदि आप ऊपर दिए गए Arrays.asList() का उपयोग करते हैं, तो मेरा दृष्टिकोण काम नहीं करेगा। इसके बजाय, आपको हमेशा एक ऐरेलिस्ट में पास करने की आवश्यकता होती है, या सिक्का रेस्पॉन्स कन्स्ट्रक्टर को सूची पैरामीटर को एक नए ArrayList() में लपेटना चाहिए। –

4
@XStreamAlias("coins") 
public class Coins { 
     @XStreamImplicit(itemFieldName="coin") 
     List<String> coins = new ArrayList<String>(); 
} 
संबंधित मुद्दे