当前位置: 首页 > 知识库问答 >
问题:

使用不同的JSON属性名继承模型

越健
2023-03-14

我有一个类,比如说Person,我想用Jackson从JSON中填充它,但是属性名因源而异。下面是代码当前的外观:

class Person {
    protected String firstName;
    protected String lastName;
    protected String address;

    public abstract void setFirstName(String firstName);
    public abstract void setLastName(String lastName);
    public abstract void setAddress(String address);

    // getters etc.
}

class PersonFormat1 extends Person {
    @Override
    @JsonProperty("firstName")
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Override
    @JsonProperty("lastName")
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override("address")
    public void setAddress(String address) {
        this.address = address;
    }
}

class PersonFormat2 extends Person {
    @Override
    @JsonProperty("fName")
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    @Override
    @JsonProperty("lName")
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    @Override("addr")
    public void setAddress(String address) {
        this.address = address;
    }
}

正如您所看到的,PersonFormat1PersonFormat2在结构上是相同的,但我需要不同的子类来指定不同的属性名称。

是否有一些方法可以在不需要重新声明和重新实现每个方法的样板的情况下强制执行模型?

共有1个答案

纪晨
2023-03-14

一种方法是使用PropertyName策略http://wiki.fasterxml.com/PropertyNamingStrategy

这是一个很好的简单演示,你可以如何使用它链接到如何在杰克逊使用属性命名策略

另一种是使用混合符号http://wiki.fasterxml.com/JacksonMixInAnnotations

使用MixInAnnotions,您可以创建一个Person类,并为任何其他替代属性名称设置创建Misin。

public static void main(String[] args) throws IOException {
    ObjectMapper mapper1 = new ObjectMapper();
    String person1 = "{\"firstName\":null,\"lastName\":null,\"address\":null}";
    Person deserialized1 = mapper1.readValue(person1,Person.class);

    ObjectMapper mapper2 = new ObjectMapper();
    mapper2.addMixIn(Person.class, PersonMixin.class);
    String person2 = "{\"fName\":null,\"lName\":null,\"addr\":null}";
    Person deserialized2 = mapper2.readValue(person2,Person.class);
}

public static class Person {
    @JsonProperty("firstName")
    String firstName;
    @JsonProperty("lastName")
    String lastName;
    @JsonProperty("address")
    String address;

}

public class PersonMixin {
    @JsonProperty("fName")
    String firstName;
    @JsonProperty("lName")
    String lastName;
    @JsonProperty("addr")
    String address;
}
 类似资料:
  • 问题内容: 我是刚开始学习Python的Java人。举个例子: 我肯定有很多冗余代码(我知道在Java中,上面的代码有很多冗余)。 对于已经从父类继承了哪些属性,哪些部分是多余的? 问题答案: 在python中为类编写函数时,应始终调用其超类的函数。我们可以使用它直接将相关属性传递给超类,因此您的代码如下所示: 正如其他人指出的那样,您可以替换该行 与 并且代码将执行相同的操作。这是因为pytho

  • 问题内容: 我有一个Java对象’ChildObj’,它是从’ParentObj’扩展而来的。现在,是否可以使用Java反射机制来检索ChildObj的所有属性名称和值,包括继承的属性? Class.getFields为我提供了公共属性的数组,而Class.getDeclaredFields为我提供了所有字段的数组,但是它们都不包含继承的字段列表。 有没有办法检索继承的属性呢? 问题答案: 不,你

  • 问题内容: 我已经使用具有继承性的Java绑定搜索了json模式,并且所有搜索都导致我使用“ allOf”。 使用allOf可能会解决我的问题,但我想知道json模式中是否有可以使用的构造,该构造将生成具有真实Java继承“ B扩展A”的Java代码- 而不是在B内插入A的所有属性? 我想知道这是否被支持/可行,或者我只是在做梦。如果不支持,我很想知道原因。 问题答案: 好吧,我是两者的作者: 当

  • 在OWL中,不可伸缩属性的子属性也是不可伸缩的吗?同样,非对称属性的子属性也是非对称的吗? 从逻辑上讲,它们应该是这样的,但我在OWL文档中找不到任何说明这种情况的内容。 考虑以下示例: 基于此本体,不允许出现以下情况,因为的父项是不可伸缩的: 但是是否也隐含地不反射性呢?换句话说,这是否也被禁止: 如果你认为一个属性是一组连接成对的点的箭头,那么不可反身仅仅意味着没有在同一个点开始和结束的箭头。

  • 我有几个配置文件,比如: application.yaml 我想我需要一些定制属性spring Binder.class定制,但我找不到任何解决方案。 提前感谢!

  • 我怎么能告诉Asp.Net Mvc Model Binder将有效载荷中的一些值绑定到POCO模型中的一些特定属性? 例如,我有一个POCO模型,它有两个属性:FirstName和LastName,但我得到的JSON对象有不同的名称,比如first_name_text和last_name_text。我使用了一个模型绑定器将first_name_文本绑定到POCO中的FirstName属性等。 我在