XStream другой псевдоним для одного класса (Map.class) для разных полей

Я использую XStream для преобразования класса Java, который имеет поля типа java.util.Map. У меня есть преобразователь для java.util.Map, который отображает ключ карты как элемент xml и значение карты как значение для элемента 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>

Вместо появления тегов карты я хотел бы использовать разные теги на основе имени поля в классе. Например, в списке «Платежи» будет указано название платежа, а в списке «Элементы» будет элемент имени тега для каждого элемента «Карта».

Как мы динамически устанавливаем псевдоним на основе поля в том же классе?

-Ананд


person Anand    schedule 26.07.2011    source источник


Ответы (1)


Я использовал 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));
person Yen Xu    schedule 01.08.2012
comment
Спасибо Йен за ответ. - person Anand; 29.07.2013