2015-07-03 42 views
0

我遇到的問題是我有一個用於許多地方的共同對象,在本例中常用對象是Student。學生是另一個名爲Enrollment的對象的屬性(但它可能是許多其他類的屬性)。現在沒有自定義序列化應用於學生我會得到這樣的東西:Jackson自定義序列化程序:將對象更改爲包含對象中的簡單屬性和值

{「會議」:「上午9點,」學生「:{」名字「:」喬「,」lastName「:」Bloggs「} }

我想什麼做的是自定義序列適用於學生,使在任何地方它出現在我的代碼,在這個例子中的,例如,招生類中,我會得到這樣的:

{ 「session」:「上午9點」,「firstName」:「Joe」,「lastName」:「Bloggs」}

或者如果我這樣選擇:

{ 「會話」: 「上午9點星期三」, 「第一」: 「喬」, 「最後的」: 「布羅格斯」}

或甚至是這樣的:

{ 「會話」: 「上午9點星期三」 ,「名」:「李四」}

這裏是我的示例代碼:

public class Enrolment { 

    private String session; 
    private Student student; 

    public Enrolment(String session, Student student) { 
     this.session = session; 
     this.student = student; 
    } 

    public String getSession() { 
     return session; 
    } 

    public void setSession(String session) { 
     this.session = session; 
    } 

    public Student getStudent() { 
     return student; 
    } 

    public void setStudent(Student student) { 
     this.student = student; 
    } 
} 

@JsonSerialize(using = StudentSerializer.class) 
public class Student { 

    private String firstName; 
    private String lastName; 

    public Student(String firstName, String lastName) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 
} 

public class StudentSerializer extends JsonSerializer<Student> { 

    @Override 
    public void serialize(Student value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
     // ?????? 
    } 
} 

public class Launcher { 

    public static void main(String[] args) throws Exception{ 

     ObjectMapper mapper = new ObjectMapper(); 
     Student student = new Student("Joe", "Bloggs"); 
     Enrolment enrolment = new Enrolment("9am Wednesday", student); 

     System.out.println(mapper.writeValueAsString(enrolment)); 

    } 
} 

這將是一個巨大的獎金,如果你能提供一個解串器也使得它可以接受所需的JSON的一個序列化示例並從中創建Student對象。像串行器一樣,解串器也必須附加到Student對象,以便在出現的任何地方執行相同的操作。

謝謝:)

回答

1

你想從1.9版本起@JsonUnwrapped註解。您可以查看文檔的2.0版本here,但基本上你會:

public class Enrolment { 
    ... 
    @JsonUnwrapped 
    public Student getStudent() { 
     return student; 
    } 
    ... 
} 

而且你會得到你的第一個選項:

{"session":"9am Wednesday","firstName":"Joe","lastName":"Bloggs"} 

註釋依賴於默認的序列。一方面,您不能爲Student自定義序列化程序,但另一方面,您可以使用其他註釋,如@JsonProperty和自定義Student以獲得第二個選項。

您的第三個選項將通過在Student中添加一個自定義獲取器和設置器來完成。在這種情況下,您將使用@JsonIgnore來避免序列化其他屬性。

0

這裏是另一種選擇我已經偶然發現:

public class Enrolment { 

    private String session; 
    private Student student; 

    public Enrolment(String session, Student student) { 
     this.session = session; 
     this.student = student; 
    } 

    public String getSession() { 
     return session; 
    } 

    public void setSession(String session) { 
     this.session = session; 
    } 

    @JsonUnwrapped 
    public Student getStudent() { 
     return student; 
    } 

    public void setStudent(Student student) { 
     this.student = student; 
    } 
} 

public class StudentUnwrappingBeanSerializer extends UnwrappingBeanSerializer { 

    public StudentUnwrappingBeanSerializer(BeanSerializerBase src, NameTransformer transformer) { 
     super(src, transformer); 
    } 

    @Override 
    public JsonSerializer<Object> unwrappingSerializer(NameTransformer transformer) { 
     return new StudentUnwrappingBeanSerializer(this, transformer); 
    } 

    @Override 
    protected void serializeFields(Object bean, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException { 

     Student student = (Student) bean; 
     jgen.writeStringField("first", student.getFirstName()); 
     jgen.writeStringField("last", student.getLastName()); 
    } 

    @Override 
    public boolean isUnwrappingSerializer() { 
     return true; 
    } 
} 

public class Launcher { 

    public static void main(String[] args) throws Exception{ 

     ObjectMapper mapper = new ObjectMapper(); 

     mapper.registerModule(new Module() { 
      @Override 
      public String getModuleName() { 
       return "my.module"; 
      } 

      @Override 
      public Version version() { 
       return Version.unknownVersion(); 
      } 

      @Override 
      public void setupModule(SetupContext context) { 

       context.addBeanSerializerModifier(new BeanSerializerModifier() { 
        @Override 
        public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) { 
         if(beanDesc.getBeanClass().equals(Student.class)) { 
          return new StudentUnwrappingBeanSerializer((BeanSerializerBase) serializer, NameTransformer.NOP); 
         } 
         return serializer; 
        } 
       }); 

      } 
     }); 

     Student student = new Student("Joe", "Bloggs"); 
     ExtendableOption<StudyType> studyType = new ExtendableOption<>(StudyType.DISTANCE); 
     Enrolment enrolment = new Enrolment("9am Wednesday", student, studyType); 

     System.out.println(mapper.writeValueAsString(enrolment)); 

    } 
} 
相關問題