2010-09-29 40 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。我使用Spring 3 MVC作为我的Web框架。

回答

23

假设你有一个类型属性的钱币类,如下所示:

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

而且你有一个硬币类constains硬币的列表:

@XStreamAlias("coins") 
public class Coins{ 

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

,请注意注释。列表是隐含的,硬币类将显示为“硬币”。

输出将是:

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

这不是你要的是相同的,但有一个原因。

首先,硬币只有一个属性,但我们不确定是否所有要显示的对象都只有一个属性。所以,我们需要告诉我们在谈论哪个对象属性。

您还可以将Coin属性显示为XML属性,而不是字段。具体如下:

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

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

这里是输出:

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

希望它能帮助。

+0

谢谢,这不幸是唯一的方法来做到这一点。创建一个无用的包装类。 '#alias(“硬币”,列表.class)'(伪代码)没有选项。 – 2013-01-10 14:46:18

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在转换CoinResponse时使用“硬币”,然后根本不使用任何名称。

+0

我刚注意到一些东西。如果您像上面那样使用Arrays.asList(),我的方法将无法工作。相反,您需要始终传入ArrayList,否则CoinResponse构造函数应该将list参数包装到新的ArrayList()中。 – 2010-09-29 19:57:32

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