2015-07-03 38 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)); 

    } 
} 
相关问题