2011-07-26 27 views
1

XStreamを使用して、java.util.Map型のフィールドを持つJavaクラスを変換しています。 Mapのキーをxml要素として、マップの値をxml要素の値として表示するjava.util.Map用のコンバータがあります。私はregisterConverterメソッドを使用してコンバータを登録しました。マーシャリングを実行すると、次の出力が得られます。異なるフィールドの同じクラス(Map.class)の異なるXStream別名

<cart account_id="123" shift_id="456" account_postings_id="641"> 
    <supervisor_id>555</supervisor_id> 
    <payments> 
    <map sequence="1"> 
     <amount>123.45</amount> 
     <billing_method>12345</billing_method> 
     <form>card</form> 
     <delivery_mode>Q</delivery_mode> 
    </map> 
    <map sequence="2"> 
     <amount>123.45</amount> 
     <person_id>2333</person_id> 
     <form>cash</form> 
     <delivery_mode>Q</delivery_mode> 
    </map> 
    </payments> 
    <items> 
    <map sequence="3"> 
     <amount>1.00</amount> 
     <type>pay_toll</type> 
     <toll_id>1234</toll_id> 
    </map> 
    </items> 
</cart> 

マップタグの代わりに、クラス内のフィールド名に基づいて異なるタグを使用したいと考えています。たとえば、Paymentsリストにはタグ名の支払いがあり、Itemsリストには各Mapエレメントのタグ名項目があります。

同じクラスのフィールドに基づいて別名を動的に設定するにはどうすればよいですか?

-Anand

答えて

1

私は、Atomフィードのレポートを作成するためにXStreamを使用。コンテンツ内のエントリは異なるオブジェクトクラスにすることができ、クラス名を動的に使用したいと考えました。ここに私の解決策があります。 ObjectContentConverterを作成し、XStreamを渡してからxstream.aliasField() with getClass().getSimpleName()を使用しました。

private class ObjectContentConverter implements Converter { 
    XStream xStream; 

    private ObjectContentConverter(XStream xStream) { 
     this.xStream = xStream; 
    } 

    @Override 
    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) { 
     String className = WordUtils.uncapitalize(source.getClass().getSimpleName()); 
     xStream.aliasField(className, Content.class, "objectContent"); 
     xStream.marshal(source, writer); 
    } 

    @Override 
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { 
     return null; //To change body of implemented methods use File | Settings | File Templates. 
    } 

    @Override 
    public boolean canConvert(Class type) { 
     return true; //To change body of implemented methods use File | Settings | File Templates. 
    } 
} 

xStream.registerLocalConverter(Content.class, "objectContent", new ObjectContentConverter(xStream)); 
+0

あなたの答えはありがたいです。 – Anand

関連する問題