使用jackson序列化/反序列化具有不同属性的子属性

时间:2017-04-17 12:55:53

标签: java json jackson jackson-databind

我必须参加POJO课程(A和B)

A{
   a_id;
   a_name;
    @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, 
     property="b_name")
   @JsonIdentityReference(alwaysAsId=true)
   B b;
}

B{
    b_id;
    b_name;
 }

要将对象A序列化为json我需要b_name,而反序列化对象A我想要b_id;

简而言之,我想用父对象传递子字段的b_name。反序列化时我会得到b_id,所以它应该绑定到B对象(b_id)。所以同一个子对象在序列化和反序列化时应该使用不同的属性。

来自server = {a_id = 1,a_name =“abc”,b =“pqr”}
来自客户= {a_id = 1,a_name =“abc”,b = 1}
b在序列化时为b_name,在反序列化时为b_id。

有可能吗?

1 个答案:

答案 0 :(得分:0)

是的,应该是可能的。 在序列化时,如果你的b_id将为null,并且你不希望它包含在json中,你可以使用:

@JsonInclude(Include.NON_NULL)
class B {
}

在反序列化时,由于您不会获得b_name,因此您可以在B级别拥有@JsonIgnoreProperties(ignoreUnknown = true)。它告诉jackson忽略任何无法映射到现有java字段的JSON属性。

如果您对字段的包含/排除要求比这更复杂,那么您可以使用 JsonSerializer JsonDeserializer 。 类似的东西:

public class MySerializer extends JsonSerializer<A> {
    @Override
    public void serialize(A a, JsonGenerator jGen, SerializerProvider arg2)
            throws IOException, JsonProcessingException {
        jGen.writeStartObject();
        jGen.writeStringField("a_id", a.getA_id());
        jGen.writeStringField("b_name", a.getB().getB_name() );
        jGen.writeEndObject();
    }
}