将Java POJO转换为Map而不进行JSON序列化

时间:2018-06-09 05:32:26

标签: java

我想将Java POJO转换为Map ,而不使用使用属性的JSON序列化(例如,将Date转换为long或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 Stackoverflow问题中描述的this,但结果不是我想要的。例如,如果我这样做:

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}

虽然我只想让Map保留java.util.Date实例而不进行序列化。

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

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

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:1)

杰克逊默认将日期序列化为时间戳格式(自1970年1月1日起,UTC时间的毫秒数)。 @JsonFormat注释可用于控制各个类的日期格式。

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

答案 1 :(得分:1)

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

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

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

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