2012-12-09 33 views
0

您好,我正嘗試使用Xstream解析器將以下xml轉換爲對象。 我嘗試使用下面的代碼將XML轉換,但我得到Xstream解析器中的數組轉換

Duplicate field ERRORS 
---- Debugging information ---- 
field    : ERRORS 
class    : com.avidev9.Fees.GCSFeesResponse$DebitsWSDS 
required-type  : com.avidev9.Fees.GCSFeesResponse$DebitsWSDS 
converter-type  : com.thoughtworks.xstream.converters.reflection.ReflectionConverter 
path    : /DebitsWSDS/ERRORS[2] 
line number   : 1 
version    : null 

我用

xstream.alias("DebitsWSDS", DebitsWSDS.class); 
      xstream.alias("DEBITS", DebitsWSDS.DEBITS.class); 
      xstream.alias("list", DebitsWSDS.class); 
      xstream.addImplicitCollection(DebitsWSDS.class, "ERRORS"); 


      xstream.alias("ERROR_ID", String.class); 
      xstream.alias("TABLE_NAME", String.class); 
      xstream.alias("TABLE_ID", String.class); 
      xstream.alias("ROW_ID", String.class); 
      xstream.alias("ERROR_TEXT", String.class); 
      xstream.alias("ERROR_CODE", String.class); 
      xstream.alias("COLUMN_ID", String.class); 
      xstream.alias("ERROR_TYPE", String.class); 

XML

<DebitsWSDS xmlns=""> 
     <DEBITS> 
      <DEBIT_ID>-1</DEBIT_ID> 
      <ACCOUNT_ID>12321312313</ACCOUNT_ID> 
      <EFFECTIVE_DATE>2012-12-12T00:00:00-06:00</EFFECTIVE_DATE> 
      <DAY_OF_MONTH>12</DAY_OF_MONTH> 
      <DEBIT_TYPE>S</DEBIT_TYPE> 
      <OCCURS_NUM>1</OCCURS_NUM> 
      <DEBIT_AMOUNT>750</DEBIT_AMOUNT> 
      <MEMO>S</MEMO> 
      <ACTIVE_FLAG>Y</ACTIVE_FLAG> 
      <MODIFIED_BY/> 
      <DEBIT_AUTHORIZED/> 
      <DEBIT_AUTHORIZED_BY/> 
      <REMAINING_OCCURRENCES>0</REMAINING_OCCURRENCES> 
     </DEBITS> 

     <ERRORS> 
      <ERROR_ID>1</ERROR_ID> 
      <TABLE_NAME>Debits</TABLE_NAME> 
      <TABLE_ID>-1</TABLE_ID> 
      <ROW_ID>0</ROW_ID> 
      <COLUMN_ID>EXCEPTION</COLUMN_ID> 
      <ERROR_TYPE>E</ERROR_TYPE> 
      <ERROR_CODE>4</ERROR_CODE> 
      <ERROR_TEXT>This debit type is not allowed for this company and policy group</ERROR_TEXT> 
     </ERRORS> 

     <ERRORS> 
      <ERROR_ID>2</ERROR_ID> 
      <TABLE_NAME>Clients</TABLE_NAME> 
      <TABLE_ID/> 
      <ROW_ID>0</ROW_ID> 
      <COLUMN_ID>CLOSE_SCHED_DATE</COLUMN_ID> 
      <ERROR_TYPE>E</ERROR_TYPE> 
      <ERROR_CODE>4</ERROR_CODE> 
      <ERROR_TEXT>Client has been closed. Cannot Authorize Draft.</ERROR_TEXT> 
     </ERRORS> 

     <ERRORS> 
      <ERROR_ID>3</ERROR_ID> 
      <TABLE_NAME>Debits</TABLE_NAME> 
      <TABLE_ID>-1</TABLE_ID> 
      <ROW_ID>0</ROW_ID> 
      <COLUMN_ID>EXCEPTION</COLUMN_ID> 
      <ERROR_TYPE>E</ERROR_TYPE> 
      <ERROR_CODE>4</ERROR_CODE> 
      <ERROR_TEXT>Cannot Schedule a Debit or Draft. Client has been closed.</ERROR_TEXT> 
     </ERRORS> 

      <ERRORS> 
       <ERROR_ID>1</ERROR_ID> 
       <TABLE_NAME>Debits</TABLE_NAME> 
       <TABLE_ID>-1</TABLE_ID> 
       <ROW_ID>0</ROW_ID> 
       <COLUMN_ID>ACTIVE_FLAG</COLUMN_ID> 
       <ERROR_TYPE>W</ERROR_TYPE> 
       <ERROR_CODE>4</ERROR_CODE> 
       <ERROR_TEXT>Creating debit on inactive Client account.</ERROR_TEXT> 
      </ERRORS> 
    </DebitsWSDS> 

我的階級結構的代碼。

package com.avidev9.Fees; 

import java.util.List; 

public class DebitsWSDS { 
     public List<ERROR> ERRORS; 
     public DEBITS DEBITS; 

    public class ERROR { 
     public String TABLE_NAME; 
     public String TABLE_ID; 
     public String ERROR_ID; 
     public String ROW_ID; 
     public String ERROR_TEXT; 
     public String ERROR_CODE; 
     public String COLUMN_ID; 
     public String ERROR_TYPE; 
    } 

    public class DEBITS { 
     public String EFFECTIVE_DATE; 
     public String ACTIVE_FLAG; 
     public String ACCOUNT_ID; 
     public String DEBIT_AUTHORIZED_BY; 
     public String DAY_OF_MONTH; 
     public String DEBIT_ID; 
     public String MEMO; 
     public String REMAINING_OCCURRENCES; 
     public String DEBIT_TYPE; 
     public String OCCURS_NUM; 
     public String DEBIT_AMOUNT; 
     public String DEBIT_AUTHORIZED; 
     public String MODIFIED_BY; 
    } 

} 
+0

一些如何能夠毫無錯誤地解析它。但我無法訪問列表。每當試圖訪問列表是給com.avidev9.Fees.DebitsWSDS不能轉換爲com.avidev9.Fees.DebitsWSDS $ ERROR \t at com.avidev9.XmlTest – Avidev9

回答

0

通過xstream處理列表有點棘手。你需要添加一個implicitCoolection部分

xstream.alias("list", ERRORS.class); 
xstream.addImplicitCollection(ERRORS.class, "ERRORS"); 

希望這有助於!

+0

:(好沒有工作。我得到沒有字段「ERRORS 「隱式集合 – Avidev9

+0

@ Avidev9:我忘了提及,在'GCSFeesResponse'類中使用列表字段名稱,這對我和其他OP都有效:http://stackoverflow.com/questions/13078289/serialization-issues- in-xstream –

+0

你的解決方案看起來很有希望但是出現錯誤沒有這樣的字段com.avidev9.Fees.DebitsWSDS.ERRORS ----調試信息---- 字段:錯誤 class:com.avidev9.Fees.DebitsWSDS required-type:com.avidev9.Fees.DebitsWSDS converter-type:com.thoughtworks.xstream .converters.reflection.ReflectionConverter 路徑:/ DebitsWSDS /錯誤 行號:1個 版本:空 更新的問題,身體以及 – Avidev9

0

在你的類中,你有一個字符串和整數變量的組合。但在使用別名()時,您只提到String.class

您應該將所有變量聲明爲String並嘗試運行您的代碼。

+0

嘗試,以及didnt工作。 – Avidev9

+0

那麼,你可以刪除XML中的並運行,因爲你沒有任何值? –

+0

好吧,不能刪除它們,因爲它們是從web服務返回 – Avidev9