Я использую полезную нагрузку 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 и нахождение Списка вместо этого - я действительно не знаю.
Если я правильно понял, это то, что вы ищете. 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);
Я пробовал это, и он работает довольно хорошо. Попробуйте и дайте мне знать.