思路
对象转map,想到的有两种方式
- 反射:获取字段名,组装map
- 对象转 json 再转 map
在本人的经验中,用 json 比较多,故在效率优先的工作环境中,选择用 json
遇到的问题:
- Date类型的属性,默认被转成 时间戳
一、fastjson 时间戳问题
以往使用 fastjson 的频率比较多,所以先选择了 fastjson 来进行转换;
出现一个问题,Date 类型的属性,转成json 之后,变成了时间戳 birthday:1618741337000
-
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.annotation.JSONField; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import lombok.experimental.Accessors; import java.io.IOException; import java.util.Date; import java.util.Map; /** * @author pishi * @description: todo * @date 2021年04月18日 6:04 下午 */ @Data @Accessors(chain = true) public class User { private String name; private Date birthday; public static void main(String[] args) { User user = new User(); user.setName("pishi") .setBirthday(new Date()); String json = JSON.toJSONString(user); Map map = JSON.parseObject(json, Map.class); map.forEach((key,value)->{ System.out.println(key+":"+value); }); } } birthday:1618741337000 name:pishi
二、JsonFormat 注解
-
出现 Date 类型转换成 时间戳问题之后,首先想到的是:Springmvc controller 中 使用 @ResponseBody 注解,实现对象自动转 json 字符串 传给前端时,常常使用的注解,@JsonFormat
-
查看 @JsonFormat 发现,该注解是 jackson 包下的,故使用 jackson包下的 ObjectMapper 来进行转换
-
Springmvc 当中 之所以能用,@JsonFormat 完成对 日期类型 的 json 格式化,是因为 springmvc 默认使用 jackson 来作为解析器
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
/**
* @author pishi
* @description: todo
* @date 2021年04月18日 6:04 下午
*/
@Data
@Accessors(chain = true)
public class User {
private String name;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
public static void main(String[] args) {
User user = new User();
user.setName("pishi")
.setBirthday(new Date());
ObjectMapper objectMapper = new ObjectMapper();
try {
String json = objectMapper.writeValueAsString(user);
Map map = objectMapper.readValue(json, Map.class);
map.forEach((key,value)->{
System.out.println(key+":"+value);
});
} catch (JsonProcessingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
name:pishi
birthday:2021-04-18 18:22:17
三、JSONField 注解
猜想 fastjson 也有类似的注解,便搜索得之 JSONField
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
/**
* @author pishi
* @description: todo
* @date 2021年04月18日 6:04 下午
*/
@Data
@Accessors(chain = true)
public class User {
private String name;
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date birthday;
public static void main(String[] args) {
User user = new User();
user.setName("pishi")
.setBirthday(new Date());
String json = JSON.toJSONString(user);
Map map = JSON.parseObject(json, Map.class);
map.forEach((key,value)->{
System.out.println(key+":"+value);
});
}
}
birthday:2021-04-18 18:22:17
name:pishi
四、不使用 注解
-
有时候的需求是不使用注解,不改变 原User 对象的代码
-
在转换时添加配置
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.annotation.JSONField; import com.alibaba.fastjson.serializer.SerializeConfig; import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import lombok.experimental.Accessors; import org.springframework.web.bind.annotation.ResponseBody; import java.io.IOException; import java.util.Date; import java.util.Map; @ResponseBody /** * @author pishi * @description: todo * @date 2021年04月18日 6:04 下午 */ @Data @Accessors(chain = true) public class User { private String name; private Date birthday; public static void main(String[] args) { User user = new User(); user.setName("pishi") .setBirthday(new Date()); SerializeConfig serializeConfig = new SerializeConfig(); SimpleDateFormatSerializer simpleDateFormatSerializer = new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"); serializeConfig.put(Date.class,simpleDateFormatSerializer); String json = JSON.toJSONString(user, serializeConfig); Map map = JSON.parseObject(json, Map.class); map.forEach((key,value)->{ System.out.println(key+":"+value); }); } }