StackOverflowError, потому что JSONTokener - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь преобразовать файл json, полученный через REST API, в список объектов java. Все работает хорошо, пока пара не запустится, когда я получаю ошибку StackOverFlow. Если я не вызываю этот метод, все работает хорошо. Я понятия не имею, как это решить. Спасибо

Ошибка:

Exception in thread "main" java.lang.StackOverflowError
    at org.json.JSONTokener.nextClean(JSONTokener.java:292)
    at org.json.JSONTokener.nextValue(JSONTokener.java:422)
    at org.json.JSONObject.<init>(JSONObject.java:225)
    at org.json.JSONTokener.nextValue(JSONTokener.java:431)
    at org.json.JSONObject.<init>(JSONObject.java:244)
    at org.json.JSONTokener.nextValue(JSONTokener.java:431)
    at org.json.JSONArray.<init>(JSONArray.java:124)
    at org.json.JSONTokener.nextValue(JSONTokener.java:434)
    at org.json.JSONObject.<init>(JSONObject.java:244)
    at org.json.JSONTokener.nextValue(JSONTokener.java:431)
    at org.json.JSONObject.<init>(JSONObject.java:244)
    at org.json.JSONTokener.nextValue(JSONTokener.java:431)
    at org.json.JSONArray.<init>(JSONArray.java:124)
    at org.json.JSONTokener.nextValue(JSONTokener.java:434)
    at org.json.JSONObject.<init>(JSONObject.java:244)

Метод, который вызывает REST Api:

public List<Student> getAllStudents() {
    try {

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet getRequest = new HttpGet(
                "http://localhost:8080/students/getAllStudents" + 
                "");
        getRequest.addHeader("accept", "application/json");

        HttpResponse response = httpClient.execute(getRequest);

        if (response.getStatusLine().getStatusCode() != 200) {
            throw new RuntimeException("Failed : HTTP error code : "
                    + response.getStatusLine().getStatusCode());
        }

        BufferedReader br = new BufferedReader(
                new InputStreamReader((response.getEntity().getContent())));

        String output;
        System.out.println("Output from Server .... \n");

        ObjectMapper objMap = new ObjectMapper();
        Student tabusca = new Student();
        output = br.readLine();
       tabusca = objMap.readValue(output, Student.class);

        System.out.println(tabusca.toString());
        String file = "";
        while ((output = br.readLine()) != null) {
            file += output;
            //System.out.println(output);
        }

        //System.out.println(file);

        JSONArray jsonArray= new JSONArray(file);
        List<Student> list = new ArrayList<Student>();


        for(int i=0; i<jsonArray.length(); i++) {
            Student p = new Student(); 
            p.setStudentId(jsonArray.getJSONObject(i).getLong("studentId"));
            p.setEmail(jsonArray.getJSONObject(i).getString("email"));
            p.setPassword(jsonArray.getJSONObject(i).getString("password"));
            p.setFullname(jsonArray.getJSONObject(i).getString("fullname"));
            p.setGrupa(jsonArray.getJSONObject(i).getLong("grupa"));
            p.setHobby(jsonArray.getJSONObject(i).getString("hobby"));
            p.setToken(jsonArray.getJSONObject(i).getString("token"));
            p.setAssigmentStudent(null);
            p.setAttendances(null);
            p.setStudentUid(null);
            list.add(p);
       }




        httpClient.getConnectionManager().shutdown();
        return list;

    } catch (ClientProtocolException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();
    }
    return null;
}

1 Ответ

0 голосов
/ 04 мая 2018

Проблема в том, что ваш JSON слишком «глубокий». В вашем json слишком много вложенных элементов. Синтаксический анализатор org.json получает слишком много рекурсивных вызовов методов, что приводит к Stackoverflow.

Даже если вы измените библиотеку json, вы все равно можете запустить с той же проблемой.

Чтобы решить эту проблему, вы должны либо пересмотреть структуру JSON, либо увеличить размер стека JRE с помощью аргумента jvm, например -Xss4m

...