我正在使用XStream转换具有java.util.Map类型字段的Java类。我有一个java.util.Map转换器,它将Map的键显示为xml元素,map的值显示为xml元素的值。我已经使用registerConverter方法注册了转换器。当我执行编组时,我得到以下输出。
<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>
我想要根据类中的字段名称使用不同的标记,而不是出现地图标记。例如,付款清单将标记名称付款,项目清单将为每个地图元素设置标记名称项。
我们如何根据同一类中的字段动态设置别名?
-Anand
答案 0 :(得分:1)
我使用XStream
创建了原子Feed报告。内容中的条目可以是不同的对象类,我想动态使用类名。这是我的解决方案。我创建了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));