gpt4 book ai didi

java - StackOverflowError 因为 JSONTokener

转载 作者:行者123 更新时间:2023-12-02 11:17:33 25 4
gpt4 key购买 nike

我正在尝试将通过 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;
}

最佳答案

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

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

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

关于java - StackOverflowError 因为 JSONTokener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50169608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com