Jackson serialize property with dynamically different names using mixins(Jackson 使用 mixins 序列化具有动态不同名称的属性)
问题描述
我使用不同的 NoSQL 数据库,根据数据库,我需要将id"命名为不同的.因此,例如在 OrientDB 中,id 被命名为@rid"
I use different NoSQL databases and depending on the database I need to name the "id" different. So for example in OrientDB the id is named "@rid"
@JsonProperty("@rid")
private String id;
对于 MongoDB,id 被命名为_id"
And for MongoDB the id is named "_id"
@JsonProperty("@_id")
private String id;
我不知道现代数据库开发人员有什么问题,而不仅仅是将 id 字段命名为id"^^.但现在我有一个问题.如何动态序列化/反序列化 id 字段,在某些情况下为@rid",在另一种情况下为_id"?
I do not know what is wrong with the modern DB developers not just naming the id field "id" ^^. But now I have a problem. How can I dynamically serialize/deserialize the id field in some case as "@rid" and in another case as "_id"?
根据 rmullers 的建议,我尝试使用 mixins.所以我有例如:
Based on rmullers suggestion I have tried to use mixins. So I have for example:
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 是一个完全空的接口,仅用于更好地控制哪些接口可以传递给映射器.
Where IdMixins is a completly empty interface just used to get more controll which interfaces can be passet to the mapper.
然后有一个类:
@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":
But when I run this simple test, the output is still "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"}
{"@javaClass":"test.MixinTest$Foo","id":"123","bar":"lala","@class":"Foo"} {"@javaClass":"test.MixinTest$Foo","id":"123","bar":"lala","@class":"Foo"}
推荐答案
你试过使用 http://wiki.fastxml.com/JacksonMixInAnnotations?然后,您可以使用具有不同 @JsonProperty 配置的 OrientDbMixin 和 MongoDbMixin.
Have you tried using http://wiki.fasterxml.com/JacksonMixInAnnotations? Then you can use an OrientDbMixin and a MongoDbMixin with different @JsonProperty configuration.
更新:工作示例
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 序列化具有动态不同名称的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Jackson 使用 mixins 序列化具有动态不同名称的属性
				
        
 
            
        - Spring Boot连接到使用仲裁器运行的MongoDB副本集 2022-01-01
 - 将log4j 1.2配置转换为log4j 2配置 2022-01-01
 - value & 是什么意思?0xff 在 Java 中做什么? 2022-01-01
 - C++ 和 Java 进程之间的共享内存 2022-01-01
 - Java包名称中单词分隔符的约定是什么? 2022-01-01
 - Safepoint+stats 日志,输出 JDK12 中没有 vmop 操作 2022-01-01
 - 如何使用WebFilter实现授权头检查 2022-01-01
 - Eclipse 插件更新错误日志在哪里? 2022-01-01
 - Jersey REST 客户端:发布多部分数据 2022-01-01
 - 从 finally 块返回时 Java 的奇怪行为 2022-01-01
 
						
						
						
						
						