2015-05-04 47 views

回答

3

您可以創建一個TypeAdapter,是這樣的:

public static class StudentAdapter extends TypeAdapter<Student> { 
    public void write(JsonWriter writer, Student student) 
      throws IOException { 
     if (student == null) { 
      writer.nullValue(); 
      return; 
     } 
     writer.beginObject(); 

     writer.name("name"); 
     writer.value(student.name); 

     writer.name("sequence"); 
     writeSequence(writer, student.sequence); 

     writer.endObject(); 
    } 

    private void writeSequence(JsonWriter writer, List<Integer> seq) 
      throws IOException { 
     writer.beginObject(); 
     for (int i = 0; i < seq.size(); i++) { 
      writer.name("index_" + i); 
      writer.value(seq.get(i)); 
     } 
     writer.endObject(); 
    } 

    @Override 
    public Student read(JsonReader in) throws IOException { 
     // This is left blank as an exercise for the reader 
     return null; 
    } 
} 

然後用

GsonBuilder b = new GsonBuilder(); 
b.registerTypeAdapter(Student.class, new StudentAdapter()); 
Gson g = b.create(); 

註冊它如果你運行這個用一個例子學生:

Student s = new Student(); 
s.name = "John Smith"; 
s.sequence = ImmutableList.of(1,3,4,7); // This is a guava method 
System.out.println(g.toJson(s)); 

輸出:

{"name":"John Smith","sequence":{"index_0":1,"index_1":3,"index_2":4,"index_3":7}} 
+2

//這是留給讀者的一個練習......不錯的一個:) @ durron597 – Kaushik

+2

@Kaushik他只問如何序列化,而不是反序列化:-) – durron597

+0

很酷的答案,它總是很棒學習新東西! – epoch

0

GSON支持自定義FieldNamingStrategy

new GsonBuilder().setFieldNamingStrategy(new FieldNamingStrategy() { 
    @Override 
    public String translateName(java.lang.reflect.Field f) { 
     // return a custom field name 
    } 
}); 

這顯然不包括你的情況下,一個簡單的解決方法我能想到的是使你的sequence列表transient並有實際序列帶有GSON的更正數據的地圖:

public class Student { 
    String name; 
    transient List<Integer> sequenceInternal; 
    Map<String, Integer> sequence; 
} 

並且每當您的發生更改時對象,將更改寫入序列圖。