List根元素的XStream别名
我希望能够根据列表中包含的对象类型对根列表元素进行别名。 例如,这是我目前的输出:
Gold Silver Bronze
这就是我想要的样子:
Gold Silver Bronze
我可以在全球范围内这样说,所有列表都应该别名为硬币,但我有很多不同的列表,这是行不通的。 关于如何做到这一点的任何想法? 似乎应该很简单,但当然,事实并非如此。
编辑:我应该指定,我正在尝试将对象序列化为xml。 我使用Spring 3 MVC作为我的Web框架。
假设你有一个带有type属性的Coin类,如下所示:
@XStreamAlias("coin") public class Coin { String type; }
你有一个Coins类来构成一个硬币列表:
@XStreamAlias("coins") public class Coins{ @XStreamImplicit List coins = new ArrayList (); }
注意注释。 列表是隐含的,硬币类将显示为“硬币”。
输出将是:
Gold Silver Bronze
这与你要求的不一样,但有一个原因。
首先,硬币只有一个属性,但我们不确定你想要显示的所有对象是否也只有一个属性。 所以,我们需要告诉我们正在讨论哪个对象属性。
您还可以将Coin属性显示为XML属性,而不是字段。 如下:
@XStreamAlias("coin") public class Coin { @XStreamAsAttribute String type; Coin(String type) { this.type = type; } }
这是输出:
希望能帮助到你。
这不是一个理想的解决方案,因为它需要一个单独的包装类,但你可以这样做:
public class CoinResponse { private List coinList; public CoinResponse(List coinList) { this.coinList = coinList; } public List getCoins() { return this.coinList; } }
这是丑陋的部分:
List 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时使用“硬币”,然后根据列表本身不使用任何名称。
@XStreamAlias("coins") public class Coins { @XStreamImplicit(itemFieldName="coin") List coins = new ArrayList (); }