XStream - Базируйтесь как набор объектов

Я использую полезную нагрузку XML, которая выглядит примерно так (для более всестороннего примера, выезда: http://api.shopify.com/product.html).


   
      ...
   
   
      ...
   

Теперь в настоящее время мой код действительно работает, но его выполнение чего-то, что, кажется, является действительно действительно "неправильным" - а именно, он связывает "продукты" с List.class. Таким образом, соответствующие нормы похожи на следующее:

    xstream.alias( "products", List.class );
    xstream.alias( "product", ShopifyProduct.class );

Это прекрасно кроме тех случаев, когда я, goto воплощают любой объект с этим xstream экземпляр это всегда, использую "продукты", конечно, который не является тем, что я хочу.

Я хотел бы любому смочь отобразить универсальные наборы на тег:

xstream.alias( "products", ( List ).class ); // way too easy 

Или заставьте следующий отрывок работать, который не делает в данный момент:

    ClassAliasingMapper mapper = new ClassAliasingMapper( xstream.getMapper( ) );
    mapper.addClassAlias( "product", ShopifyProduct.class );
    xstream.registerLocalConverter( ShopifyProductResponse.class, "products", new CollectionConverter( mapper ) );

Я создал класс ShopifyProductResponse, чтобы попытаться перенести ShopifyProduct, но не наличие любого того сообщения мне:

com.thoughtworks.xstream.mapper. CannotResolveClassException: продукты: продукты в com.thoughtworks.xstream.mapper. DefaultMapper.realClass(DefaultMapper.java:68) в com.thoughtworks.xstream.mapper. MapperWrapper.realClass(MapperWrapper.java:38)

Если я добавляю:

xstream.alias( "products", List.class );

тогда это уходит..., таким образом, кажется мне, что mapperwrapper не утверждается здесь - вероятно, потому что его поиск объекта ShopifyProductResponse и нахождение Списка вместо этого - я действительно не знаю.

5
задан Lypheus 28 June 2010 в 21:23
поделиться

1 ответ

Если я правильно понял, это то, что вы ищете. ShoppifyProductResponse.java

public class ShoppifyProductResponse {

private List<ShoppifyProduct> product;

/**
 * @return the products
 */
public List<ShoppifyProduct> getProducts() {
    return product;
}

/**
 * @param products
 *            the products to set
 */
public void setProducts(List<ShoppifyProduct> products) {
    this.product = products;
}

}

И конвертер для этого. UnMarshalling может выглядеть так.

public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
    /**
     * Tune the code further..
     */
    ShoppifyProductResponse products = new ShoppifyProductResponse();
    List<ShoppifyProduct> lst = new ArrayList<ShoppifyProduct>();
    while (reader.hasMoreChildren()) {
        reader.moveDown();
        ShoppifyProduct thisProduct = (ShoppifyProduct) context.convertAnother(products,
                ShoppifyProduct.class);
        lst.add(thisProduct);
        reader.moveUp();
    }
    products.setProducts(lst);
    return products;
}

И вы можете зарегистрировать это как,

    XStream stream = new XStream();
    stream.alias("products", ShoppifyProductResponse.class);
    stream.registerConverter(new ShoppifyConverter());
    stream.alias("product", ShoppifyProduct.class);

Я пробовал это, и он работает довольно хорошо. Попробуйте и дайте мне знать.

6
ответ дан 14 December 2019 в 13:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: