Java实体类对象与Map对象互转

Java实体类对象与Map对象互转实体类对象转Map对象使用Fastjsonpublic<T>Map<String,Object>toMapByJson(Tobj){//默认序列化为数字类型的时间戳//StringjsonStr=JSON.toJSONString(obj);/

大家好,欢迎来到IT知识分享网。

实体类对象转Map对象

使用Fastjson

public <T> Map<String, Object> toMapByJson(T obj) {
    // 默认序列化为数字类型的时间戳
    // String jsonStr = JSON.toJSONString(obj);

    // Fastjson内置了一个默认的日期格式yyyy-MM-dd HH:mm:ss,
    // 可以通过在调用JSON.toJSONString时传入SerializerFeature.WriteDateUseDateFormat来启用。
    // 通过修改默认的时间格式,结合启用默认日期格式,也可以达到按指定日期格式序列化的目的
    // JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
    String jsonStr = JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
    Map<String, Object> map = JSON.parseObject(jsonStr, new TypeReference<Map<String, Object>>() {
    });
    return map;
}

使用反射

public <T> Map<String, Object> toMapByReflect(T obj) {
      Field[] fields = obj.getClass().getDeclaredFields();
      Map<String, Object> map = new HashMap<>();

      try {
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
          for (Field f : fields) {
              f.setAccessible(true);
              Object val = f.get(obj);
              if (f.getType() == Date.class) {
                  map.put(f.getName(), sdf.format(val));
              } else {
                  map.put(f.getName(), val);
              }
          }
      } catch (IllegalArgumentException | IllegalAccessException e) {
          e.printStackTrace();
      }

      return map;
  }

Map对象转实体类对象

使用Fastjson

public <T> T toObjByJson(Map<String, Object> map, Class<T> type) {
    // 日期格式参照上文
    T t = JSON.parseObject(JSON.toJSONString(map), type);
    return t;
}

使用反射

public <T> T toObjByReflect(Map<String, Object> map, Class<T> type) {
    T obj = null;
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        obj = type.newInstance();
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field f : fields) {
            int mod = f.getModifiers();
            if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
                continue;
            }
            f.setAccessible(true);
            if (map.containsKey(f.getName())) {
                if (f.getType() == Date.class) {
                    f.set(obj, sdf.parse((String) map.get(f.getName())));
                } else {
                    f.set(obj, map.get(f.getName()));
                }
            }
        }

    } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | ParseException e) {
        e.printStackTrace();
    }

    return obj;
}

测试

新建实体类

public class Person {
    private Integer id;
    private String name;
    private Date birthDay;

    public Person() {

    }

    public Person(Integer id, String name, Date birthDay) {
        this.id = id;
        this.name = name;
        this.birthDay = birthDay;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", birthDay=" + birthDay + "]";
    }
}

测试用例

Person p = new Person(1, "Jack", new Date());
TestCopy obj = new TestCopy();
Map<String, Object> map = obj.toMapByJson(p);
System.out.println(map);

Map<String, Object> map2 = obj.toMapByReflect(p);
System.out.println(map2);

Person p1 = obj.toObjByReflect(map, Person.class);
System.out.println(p1);

Person p2 = obj.toObjByReflect(map2, Person.class);
System.out.println(p2);


输出结果

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/27678.html

(0)
上一篇 2023-09-21 10:00
下一篇 2023-09-21 11:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信