[英]gson.toJson(jObj) stackoverflowerror .TypeAdapters$25.write(TypeAdapters.java:704)
我正在嘗試使用gson將json對象轉換為String。 下面是代碼
List<Student> studs = //from db
int count = studs.size();
Integer tot_pages= count/limit;
if(page>tot_pages){
page=tot_pages;
}
Integer start=limit*page-limit;
Gson gson = new Gson();
JsonObject jObj= new JsonObject();
jObj.addProperty("page", page);
jObj.addProperty("total",tot_pages);
jObj.addProperty("records",count);
JsonArray cell = new JsonArray();
JsonArray rows = new JsonArray();
JsonObject row= new JsonObject();
for(Student stud: studs){
row= new JsonObject();
row.addProperty("id", stud.getId());
cell=new JsonArray();
JsonPrimitive name = new JsonPrimitive(stud.getName());
JsonPrimitive rollno = new JsonPrimitive(stud.getRollno());
JsonPrimitive yr = new JsonPrimitive(stud.getYr());
cell.add(name);
cell.add(rollno);
cell.add(yr);
row.add("cell", row);
rows.add(row);
System.out.println(stud.getId());
}
System.out.println("done");
jObj.add("rows", rows);
System.out.println("done1");
return gson.toJson(jObj);
並得到下面的錯誤
造成原因:java.lang.StringBuffer.append(StringBuffer.java:237)的java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:416)的java.io.StringWriter.write(StringWriter.java的java.lang.StackOverflowError :101),位於com.google.gson.stream.JsonWriter.string(JsonWriter.java:534),位於com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402),位於com.google.gson.stream。 com.google.gson.internal.bind.TypeAdapters $ 25.write(TypeAdapters.java:686)的com.google.gson.internal.bind.TypeAdapters $ 25.write(TypeAdapters)的JsonWriter.value(JsonWriter.java:495) com.google.gson.internal.bind.TypeAdapters $ 25.write(TypeAdapters.java:704)上com.google.gson.internal.bind.TypeAdapters $ 25.write(TypeAdapters.java:704)上的java:704)在com.google.gson.internal.bind.TypeAdapters $ 25.write(TypeAdapters.java:704)在com.google.gson.internal的.google.gson.internal.bind.TypeAdapters $ 25.write(TypeAdapters.java:704) .bind.TypeAdapters $ 25.write(TypeAdapters.java:704)<-----此行重復 d很多次。
請有人幫我。
更改:
row.add("cell", row);
至:
row.add("cell", cell);
Gson
一句, Gson
對象非常強大,應該能夠序列化學生列表,而無需使用您現在正在使用的所有手動代碼。 最糟糕的是,您應該考慮為您的學生班級創建TypeAdapter
,向Gson注冊它,並序列化為列表:
假設學生班:
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String ssn;
private String schoolId;
private String firstName;
private String middleName;
private String lastName;
private Calendar enrollDate;
// Constructors, getters/setters
@Override
public String toString() {
return String.format("Student[%s,%s (%s)]", getLastName(),
getFirstName(), getSchoolId());
}
}
對應的適配器:
public class StudentAdapter extends TypeAdapter<Student> {
public StudentAdapter() {
super();
}
@Override
public Student read(final JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
final Student student = new Student();
reader.beginObject();
while (reader.hasNext()) {
final String name = reader.nextName();
if ("firstName".equals(name)) {
student.setFirstName(reader.nextString());
} else if ("lastName".equals(name)) {
student.setLastName(reader.nextString());
} else if ("schoolId".equals(name)) {
student.setSchoolId(reader.nextString());
}
}
reader.endObject();
return student;
}
@Override
public void write(final JsonWriter writer, final Student student)
throws IOException {
if (student == null) {
writer.nullValue();
return;
}
writer.beginObject();
writer.name("firstName");
writer.value(student.getFirstName());
writer.name("lastName");
writer.value(student.getLastName());
writer.name("schoolId");
writer.value(student.getSchoolId());
writer.endObject();
}
}
測試代碼:
final List<Student> origStudentList = Arrays.asList(new Student(
"B12J9", "Samantha", "Cole"), new Student("A09K2", "Adebisi",
"Onihan"), new Student(null, "Miguel", "Rodriguez"));
final Gson gson = new GsonBuilder().registerTypeAdapter(Student.class,
new StudentAdapter()).create();
final String json = gson.toJson(origStudentList);
System.out.println(json);
final List<Student> unmarshalledStudentList = gson.fromJson(json,
new TypeToken<List<Student>>() {
}.getType());
System.out.println(unmarshalledStudentList);
在上面的示例中,我說明了如何創建一個適配器,該適配器選擇性地schoolId
假設的Student
對象的schoolId
, firstName
和lastName
屬性進行序列化。 您可以以此為起點,並且在我鏈接的Javadoc中還有其他類型適配器的示例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.