java.lang.IllegalStateException:这不是JSON数组

时间:2015-11-14 06:31:43

标签: java arrays json prepared-statement

我遇到两个问题:

1)java.lang.IllegalStateException:这不是JSON数组

这是我在尝试将List转换为JSON时得到的。另外plz告诉我如何处理null数组到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 - &gt; 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是一个带有getter和setter的bean类。

1 个答案:

答案 0 :(得分:0)

似乎这两个问题都与operatorList方法中OperatorDetailsDao.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
}

现在在Controller中调用此方法时:

 //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将确保返回有效的数组列表, null 值将由GSON正确处理。

另一方面 - 在GSON库中有一个issue logged,它可以处理NULL数组,并根据注释修复它。