Jackson使用Mixins用动态不同的名称序列化属性
我使用不同的NoSQL
数据库,并且根据数据库,我需要将“ id”命名为不同的名称。因此,例如在OrientDB
id中被命名为“ @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?然后你可以使用的OrientDbMixin
和MongoDbMixin
不同的@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