【问题标题】:Convert Java POJO to Map without JSON serialization在没有 JSON 序列化的情况下将 Java POJO 转换为 Map
【发布时间】:2018-06-09 05:32:26
【问题描述】:

我想将 Java POJO 转换为 Map 不使用 对属性使用 JSON 序列化(例如,将日期转换为长字符串或 ISO8601 字符串)。我只是希望这些字段保持原样。

例如,如果我有一个这样定义的 POJO:

public class MyPojo {
    private Date date;
    private String x;

    public MyPojo(Date date, String x) {
        this.date = date;
        this.x = x;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getX() {
        return x;
    }

    public void setX(String x) {
        this.x = x;
    }
}

我知道我可以使用Jackson,如this Stackoverflow 问题中所述,但结果不是我想要的。例如,如果我这样做:

Map<String, Object> x = new ObjectMapper().convertValue(new MyPojo(new Date(), "x"), new TypeReference<Map<String, Object>>() {});
System.out.println(x);

我得到这个结果:

{date=1528521584984, x=x}

而我只想保留 java.util.Date 实例而不被序列化的 Map。

请注意,我显然希望这项工作适用于嵌套的 Pojo,例如:

public class MyPojo {
   private MyOtherPojo otherPojo;
   ...
}

我怎样才能做到这一点?

【问题讨论】:

  • 你最后做了什么?我遇到过几次...
  • 别以为我可以和杰克逊一起工作。
  • 我最终选择了 apache commons BeanUtils...

标签: java


【解决方案1】:

首先,从 POJO 转到 Map 似乎是个坏主意。但我想你有理由想要这样做......

简单的方法是创建一个HashMap 并使用一系列put 调用来填充它。这为您提供了一个包含与原始 POJO 相同信息的地图,但未“连接”到 is。

如果您希望Map 成为原始 POJO 的视图,可以使用 3rd-party 库来执行此操作。例如,org.apache.commons.beanutils 具有用于将遵循 JavaBeans 约定的 POJO 包装为 DynaBean 的类。然后,您可以使用DynaBeanMapDecorator 将其调整为Map

将嵌套 POJO 映射到嵌套映射需要更多工作。 (这与您可以将getData() 的值作为Date POJO 而不是Map 的要求相矛盾!)

【讨论】:

    【解决方案2】:

    默认情况下,Jackson 会将 Date 序列化为时间戳格式(自 1970 年 1 月 1 日以来的毫秒数,UTC)。 @JsonFormat 注解可用于控制各个类的日期格式。

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")
    private Date date;
    

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多