2010-09-29 17 views
11

Listede hangi nesne türlerine bağlı olarak kök listesi öğesini taklit edebilmek istiyorum. Örneğin, bu benim şimdiki çıktısı şöyledir:XStream List kök öğelerinin diğer adları

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

Ve bu nasıl bir şey bakmak istiyorum budur: Tüm listeler diğer adı edilmelidir diyerek

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

Ben küresel düzeyde yapabilirsiniz paralar, ama çok farklı listeler var ve bu işe yaramaz. Bunu nasıl yapacağınız hakkında bir fikrin var mı? Basit olması gerektiği gibi görünüyor, ama tabi ki değil.

DÜZENLEME: Belirtmem gerekir, xml nesnelere serileştirmeye çalışıyorum. Web frameworküm olarak Spring 3 MVC kullanıyorum.

cevap

23

en aşağıdaki gibi, bir tür niteliğine sahip bir Coin sınıf var diyelim ek açıklamalar. Liste Kapalıdır ve Paralar sınıfı "paralar" olarak gösterilecektir.

çıkışı olacaktır:

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

Size istedi aynı değil, ama bir neden yoktur.

İlk başta, paranın yalnızca bir özelliği var, ancak göstermek istediğiniz tüm nesnelerin de yalnızca bir özelliği olup olmadığından emin değiliz. Yani, hangi nesne niteliğinden bahsettiğimizi söylememiz gerek.

Ayrıca, Coin niteliklerini alanları değil, XML Öznitelikleri olarak da gösterebilirsiniz. aşağıdaki gibi:

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

Umarım yardımcı olur: Burada

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

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

çıkıştır.

+0

Teşekkürler, bu maalesef bunu yapmanın tek yolu. Yararsız bir sarıcı sınıf oluşturma. #alias ("paralar", Liste .class) '(sözde kod) için bir seçenek yoktur. –

5

ayrı bir sarmalayıcı sınıf gerektirir gibi bu ideal bir çözüm değildir, ancak böyle bir şey yapabilirsiniz:

public class CoinResponse { 

    private List<Coin> coinList; 

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

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

Ve burada çirkin parçası: Temelde

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)); 

, Bu, Xstream'in CoinResponse'yi dönüştürürken "bozuk para" kullanmasını ve listenin kendisi için herhangi bir isim kullanmamalarını söylüyor.

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

Ve Coin Listesini constains bir paralar sınıf var ve:

@XStreamAlias("coins") 
public class Coins{ 

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

dikkat

+0

Sadece bir şey farkettim. Yukarıda yaptığım gibi Arrays.asList() yöntemini kullanırsanız, yaklaşımım çalışmayacaktır. Bunun yerine, her zaman bir ArrayList'e geçmeniz gerekir veya CoinResponse yapıcısı liste parametresini yeni bir ArrayList() içine sarmalıdır. –

4
@XStreamAlias("coins") 
public class Coins { 
     @XStreamImplicit(itemFieldName="coin") 
     List<String> coins = new ArrayList<String>(); 
}