2015-11-14 2 views
0

У меня возникают две проблемы:java.lang.IllegalStateException: Это не JSON массив

1) java.lang.IllegalStateException: Это не JSON массив

это я получаю при попытке конвертировать список в JSON. Также PLZ скажите мне, как обращаться с нулевым массивом в json.

2) Когда я запускаю запрос в базе данных, он получает мне 5 результатов. Когда я отлаживаю OperatorDetailsDao.java, я получаю rs.next() для запуска только один раз. И еще одна проблема заключается в том, что я получаю нулевой результат в operatorList, хотя это массив операторов.

Пожалуйста, помогите разобраться с проблемой, застрял в течение двух дней.

Контроллер класса

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 является класс компонента с геттер и наладчиков.

+0

Возможно ли предоставить вам фрагмент содержимого JSON? Что касается цикла базы данных, похоже, вы сталкиваетесь с исключением aNull pinter, поскольку вы установили оператор operatorList равным null после его инициализации в строке выше - но вы глотаете его в catch (Exception e) {}. Вам нужно просто удалить оператор инициализации, который говорит operatorList = null –

+0

Прежде всего, форматирование кода не помогает. Кроме этого, попробуйте опубликовать строку JSON. Если он начинается с '[', то это массив, если он начинается с '{' его объекта. – shyam

+0

@PrahaladDeshpande, я хочу создать JSON для использования в ajax, я написал код для создания json в файле контроллера. Но operatorList возвращает null, поэтому я не могу предоставить фрагмент json. Список arrayList (operatorList) содержит массив операторов, имеющих поля «имя» и «токен», которые являются String. –

ответ

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 
} 

Когда этот метод теперь называется в контроллере:

//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 будет гарантировать, что действительный пустой список массив и не a null Значение будет возвращено и будет правильно обработано GSON.

На боковой ноте - в библиотеке GSON было issue logged, где он не справляется с массивами NULL, и в соответствии с комментариями это исправлено.

+0

Он работал, удаляя нуль. Благодаря ! –

+0

@DevendraSingh Пожалуйста, отметьте мой ответ как ответ, если ваша проблема решена из-за этого :) –

Смежные вопросы