需求:对象转Map

思路

对象转map,想到的有两种方式

  1. 反射:获取字段名,组装map
  2. 对象转 json 再转 map
    在本人的经验中,用 json 比较多,故在效率优先的工作环境中,选择用 json

遇到的问题:

  1. Date类型的属性,默认被转成 时间戳

一、fastjson 时间戳问题

以往使用 fastjson 的频率比较多,所以先选择了 fastjson 来进行转换;

出现一个问题,Date 类型的属性,转成json 之后,变成了时间戳 birthday:1618741337000

  1. 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 注解

  1. 出现 Date 类型转换成 时间戳问题之后,首先想到的是:Springmvc controller 中 使用 @ResponseBody 注解,实现对象自动转 json 字符串 传给前端时,常常使用的注解,@JsonFormat

  2. 查看 @JsonFormat 发现,该注解是 jackson 包下的,故使用 jackson包下的 ObjectMapper 来进行转换

  3. 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

四、不使用 注解

  1. 有时候的需求是不使用注解,不改变 原User 对象的代码

  2. 在转换时添加配置

    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);
            });
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值