【问题标题】:Jackson serialize property with dynamically different names using mixinsJackson 使用 mixins 序列化具有动态不同名称的属性
【发布时间】:2015-06-05 23:25:47
【问题描述】:

我使用不同的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"}

【问题讨论】:

    标签: java jackson mixins nosql


    【解决方案1】:

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

    【讨论】:

    • 你有一个 mixins 的工作示例。我已经尝试过了(请参阅我的编辑),但我无法完成这项工作。
    • 其实不能用mapper.copy(),真的要新建一个ObjectMapper
    • 我更新了我的答案。请注意与您的代码的一些差异: 1. Mixin 可以非常简单/最小。第二:当使用mapper.copy() 时(就像你所做的那样),代码not 工作。使用新的 ObjectMapper 实例,它按预期工作
    猜你喜欢
    • 2016-02-11
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 1970-01-01
    相关资源
    最近更新 更多