我想将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;
...
}
我怎样才能做到这一点?
答案 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
!)