杰克逊使用mixins以动态不同的名称序列化属性

时间:2015-04-01 10:40:38

标签: java jackson mixins nosql

我使用不同的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符”, “ID”: “123”, “杆”: “拉拉”, “@类”: “富”} { “@javaClass”: “$ test.MixinTest符”, “ID”: “123”, “杆”: “拉拉”, “@类”: “富”}

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用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));
    }

}