2015-11-14 22 views
0

我有兩個問題:java.lang.IllegalStateException:這不是一個JSON陣列

1)java.lang.IllegalStateException:這不是一個JSON陣列

這種努力的時候我得到將List轉換爲JSON。也PLZ告訴我如何處理空數組到JSON。

2)當我在數據庫運行查詢它取了我5個結果。當我調試OperatorDetailsDao.java時,我得到rs.next()只運行一次。另一個問題是我在operatorList中得到null結果,雖然它是運算符數組。

請幫我理清問題,堅持兩天。

控制器類

public class SearchController extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException { 

      response.setContentType("application/json"); 
      try { 
       String term = request.getParameter("terms"); 
       System.out.println("Data from ajax call " + term); 

       OperatorDetialsDao details = new OperatorDetialsDao(); 
       List<OperatorDetailsBean> operatorList = details.getOperators(term); 
          System.out.println("Operator List " + operatorList); 
       JsonElement element = new Gson().toJsonTree(operatorList); 
          System.out.println(element); 
          JsonArray jsonArray = element.getAsJsonArray(); 
          response.getWriter().print(jsonArray); 
          response.getWriter().flush(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
} 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

      doPost(request, response); 
    } 

} 

OperatorDetailsDao - > getOperators()

public List<OperatorDetailsBean> getOperators(String name) { 
      PreparedStatement ps = null; 
      List<OperatorDetailsBean> operatorList = new ArrayList(); 
      operatorList = null; 
      name = name.toUpperCase(); 
      String data; 
      try { 
       ps = connection.prepareStatement("SELECT * FROM operator_details_m WHERE upper(name) LIKE ?"); 
       ps.setString(1, name + '%'); 
       ResultSet rs = ps.executeQuery(); 

       while (rs.next()) { 
        uname = rs.getString("NAME"); 
        token = rs.getString("TOKEN_NO"); 
        OperatorDetailsBean op = new OperatorDetailsBean(); 
        op.setName(uname); 
        op.setTokenNo(token); 
        operatorList.add(op); 
       } 

      } catch (Exception e) { 
       //System.out.println(e.getMessage()); 
      } 
      return operatorList; 
} 

OperatorDetailsBean是一個bean類吸氣劑和setter。

+0

是否有可能爲你提供的JSON內容的片段?至於數據庫循環而言好像你遇到品特零位例外,因爲你已經設置operatorList在上述行初始化之後空 - 但你的趕上(例外五)內囫圇吞棗它{}。您只需要刪除說operatorList = null –

+0

的初始化語句首先,您的代碼格式不起作用。除此之外,請嘗試發佈您的JSON字符串。如果它以'['開始,那麼它是一個數組,如果它以'{'它的一個對象開始。 – shyam

+0

@PrahaladDeshpande,我想創建一個JSON在ajax中使用,我已經編寫了用於在控制器文件中創建json的代碼。但是那裏operatorList返回null,所以我無法提供json片段。 arrayList(operatorList)包含字段「name」和「token」都是String的操作符數組。 –

回答

0

看來,這兩個問題都涉及到operatorListOperatorDetailsDao.getOperators()方法中的不正確初始化。下面是問題的一個註釋說明:

public List<OperatorDetailsBean> getOperators(String name) { 
      PreparedStatement ps = null; 
      List<OperatorDetailsBean> operatorList = new ArrayList(); 
      //Prahaladd - Setting this to null will cause operatorList to be null. 
     // This is not being re-initalized anywhere else 
      operatorList = null; 
      name = name.toUpperCase(); 
      String data; 
      try { 
       ps = connection.prepareStatement("SELECT * FROM operator_details_m WHERE upper(name) LIKE ?"); 
       ps.setString(1, name + '%'); 
       ResultSet rs = ps.executeQuery(); 

       while (rs.next()) { 
        uname = rs.getString("NAME"); 
        token = rs.getString("TOKEN_NO"); 
        OperatorDetailsBean op = new OperatorDetailsBean(); 
        op.setName(uname); 
        op.setTokenNo(token); 
        operatorList.add(op); //Prahaladd - definitely a NullPointerException 
       } 

      } catch (Exception e) { 
       //Prahaladd - Oops!! NPE thrown above was gulped. 
       //System.out.println(e.getMessage()); 
      } 
      return operatorList; //returned operatorList is null. Will impact gson library processing 
} 

當這個方法現在在控制器內調用:

//Prahaladd - operatorList returned would be null 
List<OperatorDetailsBean> operatorList = details.getOperators(term); 
           System.out.println("Operator List " + operatorList); 
//Prahaladd - GSON processes this null value. 
JsonElement element = new Gson().toJsonTree(operatorList); 

System.out.println(element); 
//Prahaladd - this will fail since we are trying to process a non-array 
// as a JSON array. 
JsonArray jsonArray = element.getAsJsonArray(); 

刪除違規線operatorList = null將確保有效數組列表和一個值將被返回,並將由GSON正確處理。

在旁註中 - 在GSON庫中存在一個issue logged,它無法處理NULL數組,並按照已修復的註釋操作。

+0

它工作刪除空。謝謝 ! –

+0

@DevendraSingh如果您的問題已經解決,請將我的回覆標記爲答案:) –