Jackson使用Mixins用动态不同的名称序列化属性

我使用不同的NoSQL数据库,并且根据数据库,我需要将“ id”命名为不同的名称。因此,例如在OrientDBid中被命名为“ @rid”

@JsonProperty("@rid")

private String id;

对于MongoDB,该ID名为“ _id”

@JsonProperty("@_id")

private String id;

我不知道现代数据库开发人员有什么问题,不仅仅是命名id字段“ id” ^^。但是现在我有一个问题。在某些情况下,如何将ID字段动态序列化/反序列化为“

@rid”,在另一种情况下,如何动态序列化/反序列化为“ _id”?

编辑:

基于rmullers的建议,我尝试使用mixins。所以我有例如:

public interface IdMixins {

}

public interface MongoIdMixIn extends IdMixins {

@JsonProperty("_id") String getId();

@JsonProperty("_id") void setId(String id);

}

public interface OrientIdMixIn extends IdMixins{

@JsonProperty("@rid") String getId();

@JsonProperty("@rid") void setId(String id);

}

IdMixins是一个完全空的接口,仅用于获取更多控制权,这些接口可以通过密码传递给映射器。

然后有一个类:

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@javaClass")

public abstract class AbstractBean implements Serializable {

private static final long serialVersionUID = -1286900676713424199L;

// @JsonProperty("@rid")

private String id;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

}

但是当我运行此简单测试时,输出仍然是“ id”:

public class MixinTest {

public static void main(String[] args) throws JsonProcessingException {

Foo f = new Foo();

f.setId("123");

f.setBar("lala");

ObjectMapper mapper = new ObjectMapper();

ObjectMapper m2 = mapper.copy();

m2.addMixInAnnotations(AbstractBean.class, MongoIdMixIn.class);

System.out.println(m2.writeValueAsString(f));

ObjectMapper m3 = mapper.copy();

m3.addMixInAnnotations(AbstractBean.class, OrientIdMixIn.class);

System.out.println(m3.writeValueAsString(f));

}

public static class Foo extends AbstractBean {

private String bar;

public String getBar() {

return bar;

}

public void setBar(String bar) {

this.bar = bar;

}

}

}

输出:

{“ @javaClass”:“ test.MixinTest $ Foo”,“ id”:“ 123”,“ bar”:“ lala”,“ @

class”:“ Foo”} {“ @javaClass”:“ test.MixinTest $ Foo”,“ id”:“ 123”,“ bar”:“

lala”,“ @ class”:“ Foo”}

回答:

您是否尝试过使用http://wiki.fasterxml.com/JacksonMixInAnnotations?然后你可以使用的OrientDbMixinMongoDbMixin不同的@JsonProperty配置。

更新:工作示例

public final class JacksonTest {

static final class ExampleBean {

private String id;

private String bar;

@JsonProperty("donotwanttoseethis")

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getBar() {

return bar;

}

public void setBar(String bar) {

this.bar = bar;

}

}

public interface MongoIdMixIn {

@JsonProperty("_id") String getId();

}

public interface OrientIdMixIn {

@JsonProperty("@rid") String getId();

}

private final static Logger LOG = LoggerFactory.getLogger();

public static void main(String[] args) throws JsonProcessingException {

ExampleBean bean = new ExampleBean();

bean.setId("1234");

bean.setBar("lala");

ObjectMapper m2 = new ObjectMapper();

m2.addMixInAnnotations(ExampleBean.class, MongoIdMixIn.class);

LOG.info(m2.writeValueAsString(bean));

ObjectMapper m3 = new ObjectMapper();

m3.addMixInAnnotations(ExampleBean.class, OrientIdMixIn.class);

LOG.info(m3.writeValueAsString(bean));

}

}

以上是 Jackson使用Mixins用动态不同的名称序列化属性 的全部内容, 来源链接: utcz.com/qa/421383.html

回到顶部