当前位置: 首页 > 面试题库 >

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

苏涛
2023-03-14
问题内容

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

}


 类似资料:
  • 问题内容: 我正在使用JSON.NET对对象进行序列化以连接到REST API。我对象中需要序列化为JSON的属性之一具有动态属性名称。如果此属性的struct中包含的值是数字值,则JSON属性为“ type_id”,但是,如果此值是字符串值,则JSON属性名称为“ type_code”。我尝试为此使用自定义,但是在尝试序列化时收到以下消息: “状态为Property的令牌PropertyName

  • 问题内容: 我想序列化一个对象,以便根据字段的类型对字段之一进行不同的命名。例如: 在这里,我希望将该字段序列化为类似的内容,而不是总是根据情况将字段称为包含不同类型的字段。 使用Jackson怎么能达到这样的目的? 问题答案: 使用自定义。 然后,假设您要序列化以下两个对象: 第一个将打印: 第二个: 我使用了包装对象的名称,因为它仅用作花边固定器。如果要删除它,则必须为 整个 类编写一个自定义

  • 问题内容: 我要呼吁汇率第三方API,但JSON返回不断变化,如果我申请到的转换,它将返回我:,所以如果我的要求来,它将返回我。 我将不得不使用将返回的结果映射到pojo中,是否有任何可行的方法? 我当前的硬编码解决方法: 问题答案: 是具有值的字段的对象。 否是with键/值对。 两者都是正确的,但是由于before的值是动态的(变化的),因此它是您需要的第二种解释。 因此,请勿要求将JSON转

  • 假设我们有以下JSON, 在Java类中,我们有与上述JSON匹配的所有字段。 每次要反序列化的字段列表取决于发送信息的客户。 例如,对于customer 1,我们只想读回以下值,(并且跳过其他属性,即使在JSON中提供) 例如,对于客户2,我们希望读取以下值(并跳过其他属性,即使在JSON中提供) 使用Jackson反序列化JSON时,是否可以提供上面的数组,其中包括需要反序列化的字段, 更新:

  • 问题内容: 是否可能:在类中有一个字段,而在Jackson库中进行序列化/反序列化时却为其使用不同的名称? 例如,我有“ Coordiantes”类。 对于从JSON反序列化,希望具有以下格式: 但是当我序列化对象时,结果应该是这样的: 我试图通过在getter和setter上都应用注释(具有不同的值)来实现此目的: 但我有一个例外: org.codehaus.jackson.map.exc.Un

  • 问题内容: 我有一个REST API,它返回JSON响应为: 有时它返回: 我有一个像这样的POJO: 那么,有没有一种方法(不是写你自己的其他 自定义解串器 中)Jackson2,这将有助于我映射在JSON来时,它的A型和类型时,它是一个JSON对象? 或者换句话说,在Jackson中,有没有一种方法可以按变量而不是by 映射? 问题答案: 我可以建议您像这样使用JsonNode: 或像这样 :