【问题标题】:Is possible use the same POJO in two different serializations, customizing some properties?是否可以在两个不同的序列化中使用相同的 POJO,自定义一些属性?
【发布时间】:2014-06-23 22:23:30
【问题描述】:

我想使用相同的 DTO,但在某些情况下我需要忽略某些属性,而在其他情况下我想使用它,但我不想做重复对象或自定义序列化,存在某种方式来指定,如果在此实现中使用了 DTO,则忽略此属性,如果在其他实现中使用 DTO,请不要忽略这些属性。

我正在使用 jackson 序列化 DTO

public abstract class BaseAuditDto extends BaseIdentifiableDto {



    private static final long serialVersionUID = -6010447982202996167L;

    @JsonIgnore

    private String createdBy;


    @JsonIgnore

    private Date createdDate;


    @JsonIgnore

    private String updatedBy;


    @JsonIgnore 

    private Date updatedDate;


    //getters and setters   

}

基本上我需要在某些情况下使用 createdBy 和 createdDate 但在其他情况下我不需要它。

谢谢。

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

    你可以试试Jackson views:

    在这种情况下,“视图”意味着定义逻辑子集的能力 要序列化的属性(通过 getter 或字段访问的东西)。意见 是静态定义的(使用注释),但视图用于 序列化是动态选择的(每个序列化)。

    编辑
    我想我误解了你的问题。您可以使用视图,但这将非常棘手且难以理解。您可以使用MixIn feature,这将更容易实现。假设你有两个POJO 类:

    class Pojo1 extends BaseAuditDto {
    
        private String name;
    
        //getters, setters
    }
    

    class Pojo2 extends BaseAuditDto {
    
        private String description;
    
        //getters, setters
    
    }
    

    现在我们必须使用来自BaseAuditDto 类的getter 创建接口。它可能看起来像这样:

    interface BaseAuditDtoIgnorePropertiesMixIn {
        @JsonIgnore
        String getCreatedBy();
        @JsonIgnore
        Date getCreatedDate();
        @JsonIgnore
        String getUpdatedBy();
        @JsonIgnore
        Date getUpdatedDate();
    }
    

    如您所见,上面的接口为BaseAuditDto 类中存在的方法定义了注解。现在,我们必须告诉Jackson 我们要忽略哪些类的上述属性。见以下代码:

    ObjectMapper mapper = new ObjectMapper();
    mapper.addMixInAnnotations(Pojo1.class, BaseAuditDtoIgnorePropertiesMixIn.class);
    

    现在,我们可以测试我们的类了:

    Pojo1 pojo1 = new Pojo1();
    pojo1.setCreatedBy("me");
    pojo1.setCreatedDate(new Date());
    pojo1.setUpdatedBy("you");
    pojo1.setUpdatedDate(new Date());
    pojo1.setId(1);
    pojo1.setName("Name");
    
    Pojo2 pojo2 = new Pojo2();
    pojo2.setCreatedBy("me");
    pojo2.setCreatedDate(new Date());
    pojo2.setUpdatedBy("you");
    pojo2.setUpdatedDate(new Date());
    pojo2.setId(2);
    pojo2.setDescription("Description");
    
    System.out.println(mapper.writeValueAsString(pojo1));
    System.out.println(mapper.writeValueAsString(pojo2));
    

    上面的代码打印:

    {"id":1,"name":"Name"}
    {"id":2,"createdBy":"me","createdDate":1403653155395,"updatedBy":"you","updatedDate":1403653155395,"description":"Description"}
    

    如您所见,Jackson 忽略了 Pojo1 类的 BaseAuditDto 属性。

    【讨论】:

    • 我使用的是 jackson 2.4,而 JsonViews 不适合我,你能给我一些例子吗?
    • 我理解了 JsonViews,现在我的问题是,是否可以将两个或多个 @JsonViews 设置为同一个属性?
    • 我的示例显示MixIn 功能不是JsonView。回答你的问题:我不确定,可能不是。
    【解决方案2】:

    AFAIK 如果您打算序列化/反序列化您必须提供的对象(使用标准功能)然后期望所有值,您的 serialVersionUID 定义序列化数据的格式。

    当您将数据转换为 JSON 或 XML 时,情况就不同了——您可以提供/省略一些属性,因为格式足够冗长以防止错误分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多