[英]serialize/deserialize Child property with different property using jackson
我必须去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,而反序列化对象AI则需要b_id;
简而言之,我想通过父对象传递子字段的b_name。 反序列化时,我会得到b_id,因此它应该绑定到B object(b_id)。 因此,同一子对象在序列化和反序列化时应具有不同的属性。
来自服务器= {a_id = 1,a_name =“ abc”,b =“ pqr”}
来自客户端= {a_id = 1,a_name =“ abc”,b = 1}
b在序列化时是b_name,在反序列化时是b_id。
可能吗?
是的,那应该是可能的。 序列化时,如果您的b_id将为null,并且您不希望将其包含在json中,则可以使用:
@JsonInclude(Include.NON_NULL)
class B {
}
反序列化时,由于不会获得b_name,因此可以在B类级别使用@JsonIgnoreProperties(ignoreUnknown = true)
。 它告诉杰克逊忽略任何无法映射到现有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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.