我希望能够根据列表中包含的对象类型对根列表元素进行别名。例如,这是我目前的输出:
<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框架。
答案 0 :(得分:23)
假设你有一个带有type属性的Coin类,如下所示:
@XStreamAlias("coin")
public class Coin {
String type;
}
你有一个Coins类来构成一个硬币列表:
@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>
希望它有所帮助。
答案 1 :(得分: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时使用“硬币”,然后根据列表本身不使用任何名称。
答案 2 :(得分:4)
@XStreamAlias("coins")
public class Coins {
@XStreamImplicit(itemFieldName="coin")
List<String> coins = new ArrayList<String>();
}