11

我希望能够根据列表中包含的对象类型为根列表元素起别名。例如,这是我当前的输出:

<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 框架。

4

3 回答 3

25

假设您有一个带有 type 属性的 Coin 类,如下所示:

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

你有一个包含 Coin 列表的 Coins 类:

@XStreamAlias("coins")
public class Coins{

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

注意注释。该列表是隐式的,并且 Coins 类将显示为“硬币”。

输出将是:

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

希望能帮助到你。

于 2010-09-29T20:04:27.393 回答
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 时使用“硬币”,然后根本不要为列表本身使用任何名称。

于 2010-09-29T19:38:52.270 回答
4
@XStreamAlias("coins")
public class Coins {
        @XStreamImplicit(itemFieldName="coin")
        List<String> coins = new ArrayList<String>();
}
于 2012-05-04T10:55:36.947 回答