0

我必须 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 对象(b_id)。所以同一个子对象在序列化和反序列化时应该使用不同的属性。

from server= {a_id=1, a_name="abc", b="pqr"}
from client ={a_id=1,a_name="abc",b=1}
b 是序列化时的 b_name 和反序列化时的 b_id。

可能吗?

4

1 回答 1

0

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

@JsonInclude(Include.NON_NULL)
class B {
}

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

如果您对包含/排除字段的要求比这更复杂,那么您可以使用JsonSerializerJsonDeserializer。就像是:

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();
    }
}
于 2017-04-17T17:07:42.923 回答