2013-09-05 87 views
0

我需要將Java對象轉換爲JSON字符串。 這裏是我使用的例子代碼:使用XStream對象到JSON

public class XstreamTest { 

    public static void main(String[] args) throws Exception { 
     Order order = new Order(); 
     order.id = 1; 
     order.products = new ArrayList<Product>(); 

     Product prod1 = new Product(); 
     prod1.barCode = "4821111111111"; 
     Product prod2 = new Product(); 
     prod2.barCode = "4821111111112"; 

     order.products.add(prod1); 
     order.products.add(prod2); 

     System.out.println(toJson(order)); 

    } 

    public static String toJson(Object document) throws Exception { 
     XStream xstream = new XStream(new JettisonMappedXmlDriver() { 
      public HierarchicalStreamWriter createWriter(Writer writer) { 
       return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE); 
      } 
     }); 
     xstream.autodetectAnnotations(true); 
     xstream.setMode(XStream.NO_REFERENCES); 
     xstream.alias(document.getClass().getSimpleName(), 
       document.getClass()); 
     return xstream.toXML(document); 
    } 

} 

@XStreamAlias("ORDER") 
class Order { 
    @XStreamAlias("NUMBER") 
    public int id; 

    @XStreamAlias("PRODUCT") 
    @XStreamImplicit(itemFieldName="PRODUCT") 
    public List<Product> products; 
} 

class Product { 
    @XStreamAlias("BARCODE") 
    public String barCode; 
} 

運行後,我的結果:

{ 
    "NUMBER": 1, 
    "PRODUCT": { 
    "BARCODE": "4821111111111" 
    }, 
    "PRODUCT": { 
    "BARCODE": "4821111111112" 
    } 
} 

我檢查http://www.jslint.com/ JSON和得到錯誤:重複的「產品」。

請幫忙!我做錯了什麼?或者可能是XStream中的錯誤?

回答

3

只需從Order類的products字段中刪除註釋@XStreamImplicit(itemFieldName="PRODUCT")即可。這指示XStream將您的集合序列化爲隱式集合,這意味着該集合不會有任何根對象,並且它的所有元素都將被單獨序列化幷包含在一個名爲集合名稱(PRODUCT)的對象中。這會導致JSON對象具有多個屬性(PRODUCT),這些屬性是無效的。

順便說一下,XStream最初是爲了序列化XML,您可能會嘗試使用專用的JSON序列化程序庫,例如GSON

UPDATE

由於您使用的是相同的POJO反序列化的XML,並刪除所提到的註釋符的XML反序列化,你必須在「手動」配置XStream的,以便它可以處理隱式集合該XML的反序列化:

xstream.addImplicitCollection(Order.class, "products", "PRODUCT", Product.class); 

這有不同之處在於它僅適用於反序列化標註同樣的效果。

+0

我最初的任務是:獲取XML->轉換爲Object->檢查這個Objects->將數據庫中的對象保存爲JSON數據。我認爲XStream可以處理這個......可能是:) – smie

+0

當我刪除@XStreamImplicit(itemFieldName =「PRODUCT」)時,我無法將XML轉換爲Object – smie

+0

@smie你會在你的問題中包含它嗎? – Katona