StackOverflowError因为JSONTokener

时间:2018-05-04 07:35:40

标签: java json rest api stack-overflow

我正在尝试将通过REST API接收的json文件转换为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 :(得分:1)

问题是你的JSON太“深”了。 json中有太多嵌套元素。 org.json解析器对它进行了太多的递归方法调用,导致Stackoverflow。

即使您更改了json库,您仍可能遇到同样的问题。

要解决此问题,您应该重新考虑JSON结构或使用jvm参数增加JRE堆栈大小,例如-Xss4m