有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我必须上一节课(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_名称。反序列化时,我将获得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_名称,反序列化时的b_id

可能吗


共 (1) 个答案

  1. # 1 楼答案

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

    @JsonInclude(Include.NON_NULL)
    class B {
    }
    

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

    如果包含/排除字段的要求比这更复杂,那么可以使用JsonSerializerJsonSerializer。 比如:

    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();
        }
    }