2016-11-10 108 views
0

我從JSON對象生成一個Student對象,但問題是當我創建這個對象時,我也想更新它的「studentClass」字段。我更新setStudentClass()方法,但我認爲GSON不使用這個setter字段。我如何爲fromJson()方法創建工廠方法?如何爲gson方法創建對象工廠方法?

Student student = gson.fromJson(studentJSON.toString(), Student.class); 
student.updateClassInfo(); 


public class Student{ 

    private String name; 
    private String studentClass; 

    //getters and setters 

    public void updateClassInfo(){ 

     if(studentClass.equals("1")) 
     studentClass = "starter"; 
     else if 
     ..... 
    } 

} 
+0

轉換成POJO之後,您可以設置studentClass屬性的值。之後,你想實現什麼?您在Student對象中具有最新值。 – notionquest

+0

請確保JSON字符串和POJO中的字段名稱完全相同。 GSON本身並不會忽視任何領域。並且請添加完整的Student類以及可能的JSON字符串。 –

+0

@notionquest我不想每次創建學生對象後調用updateClassInfo()方法。所以我認爲我可以創建一個對象工廠方法,並且可以使用此方法創建學生對象,但是gson創建的對象與我的想法稍有不同。 – hellzone

回答

1

這個需求可以通過使用自定義解串器來實現。下面的示例代碼: -

主要方法: -

public static void main(String[] args) { 
     String jsonString = "{\"name\":\"John\",\"studentClass\":\"1\"}"; 
     //String jsonString = "{\"name\":\"John\"}"; 

     Gson gson = new GsonBuilder() 
       .registerTypeAdapter(Student.class, new StudentModelDeserializer()) 
       .create(); 

     Student student = gson.fromJson(jsonString, Student.class); 
     System.out.println(student.toString()); 

    } 

解串器: -

public class StudentModelDeserializer implements JsonDeserializer<Student> { 

    @Override 
    public Student deserialize(JsonElement paramJsonElement, Type paramType, 
      JsonDeserializationContext paramJsonDeserializationContext) throws JsonParseException { 

     String studentClass = null; 
     if (paramJsonElement.getAsJsonObject().get("studentClass") != null) { 
      studentClass = paramJsonElement.getAsJsonObject().get("studentClass").getAsString(); 
     } 

     Student student = new Gson().fromJson(paramJsonElement.getAsJsonObject(), Student.class); 

     if (studentClass != null) { 
      if (studentClass.equals("1")) { 
       student.setStudentClass("starter"); 
      } 
     } 

     return student; 
    } 

} 

輸出: -

Student [name=John, studentClass=starter] 

輸出,如果學生課不存在: -

Student [name=John, studentClass=null]