2013-06-09 3 views
0

Я пытаюсь преобразовать объект json в String с помощью gson. Ниже приведен код

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.StackOverflowError на java.lang.AbstractStringBuilder.append (AbstractStringBuilder.java:416) на Java. lang.StringBuffer.append (StringBuffer.java:237) на java.io.StringWriter.write (StringWriter.java:101) на com.google.gson.stream.JsonWriter.string (JsonWriter.java:534) на com.google.gson.stream.JsonWriter.writeDeferredName (JsonWriter.java:402) на com.google.gson.stream.JsonWriter.value (JsonWriter.java:495) в com.google.gson.internal.bind.TypeAdapters $ 25.write (TypeAdapters.java:686) по адресу com.google.gson .internal.bind.TypeAdapters $ 25.write (TypeAdapters.java:704) в com.google.gson.internal.bind.TypeAdapters $ 25.write (TypeAdapters.java:704) в com.google.gson.internal .bind.TypeAdapters $ 25.write (TypeAdapters.java:704) на com.google.gson.internal.bind.TypeAdapters $ 25.write (TypeAdapters.java:704) в com.google.gson.internal.bind .TypeAdapters $ 25.write (TypeAdapters.java:704) по адресу com.google.gson.internal.bind.TypeAdapte rs $ 25.write (TypeAdapters.java:704) < ----- Эта строка повторяется много раз.

, пожалуйста, помогите мне.

+0

Я думаю, что вы слишком много делаете ... У вас есть «Список », и вы хотите сериализовать его в строке JSON? – MikO

ответ

3

Изменение:

row.add("cell", row); 

To:

row.add("cell", cell); 

На стороне записки, то Gson объект является достаточно мощным, и должен быть способен сериализации список студента без всего ручного кода вы» re используя сейчас. Хуже прийти к худшему, вы должны рассмотреть вопрос о создании TypeAdapter для вашего класса студент, зарегистрировав его с Gson и сериализации в виде списка:

гипотетический класс Student:

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, firstName и lastName объекта гипотетического объекта Student. Вы можете использовать это как отправную точку, и в Javadoc I есть другие примеры адаптеров типов.

+0

, но мне нужно только несколько полей от этого объекта, что я должен делать в этом случае? – Aadam

+0

Тогда вы должны использовать адаптер типа для получения этих полей. –

+0

, пожалуйста, приведи пример, который будет большой помощью. – Aadam