2010-06-28 17 views
5

sto consumando un payload XML che sembra qualcosa di simile (per un esempio più completo, check out: http://api.shopify.com/product.html).XStream - Root come un insieme di oggetti

<products type="array"> 
    <product> 
     ... 
    </product> 
    <product> 
     ... 
    </product> 
</products> 

Ora Attualmente il mio codice funziona, ma il suo fare qualcosa che sembra essere davvero "sbagliato" - vale a dire associa i "prodotti" con List.class. Così il relativo codice è simile al seguente:

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

Questo è bene, tranne quando ho goto esternare qualsiasi oggetto con tale istanza xstream utilizza sempre "prodotti", naturalmente, che non è quello che voglio.

mi piacerebbe essere sia in grado di mappare le collezioni generiche a un tag:

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

O ottenere la seguente snipet al lavoro, che non lo fa al momento:

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

I ha creato la classe ShopifyProductResponse per provare a includere ShopifyProduct, ma non ha nulla di tutto ciò che mi dice:

com.thoughtworks.xstream.mapper.CannotResolveClassException: prodotti: prodotti a com.thoughtworks.xstream.mapper.DefaultMapper.realClass (DefaultMapper.java:68) a com.thoughtworks.xstream.mapper.MapperWrapper.realClass (MapperWrapper.java:38)

se aggiungo:

indietro poi va via ... quindi mi sembra che il mapperwrapper non stia prendendo piede qui - probabilmente perché è alla ricerca di un oggetto ShopifyProductResponse e trovare invece una lista - Io davvero non lo so.

risposta

6

se ho capito correttamente, questo è quello che state cercando. 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; 
} 

}

e di un convertitore per questo. Unmarshalling potrebbe essere simile a questo.

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; 
} 

E si può registrare come,

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

Ho provato questo e funziona più o meno bene. Fai un tentativo e fammi sapere.

+0

sembra buono, non mi piace molto l'idea di avere un oggetto wrapper in più in giro per questo, ma funziona come previsto e questo è quello che conta davvero, a questo punto - grazie! – Lypheus

Problemi correlati