关闭

如何在Java中实现对象和Map之间的转换

发表于:2024-9-04 09:17

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:一安    来源:一安未来

  在Java开发中,经常需要将Java对象转换成Map,或者反过来将Map转换成Java对象。这种转换在很多场景下都非常有用,比如在序列化和反序列化过程中、在数据传输和持久化时、或者在进行对象属性的批量操作时。
  本文将介绍几种不同的方法来实现Java对象和Map之间的相互转换,选择哪种方法取决于项目的具体需求和个人偏好。
  方法一:使用Spring Framework的ReflectionUtils
  Bean转为Map
  Person person = new Person();
  person.setAge(18);
  person.setOpenid("123456");
  person.setName("一安");
  person.setSubName("公众号");
  System.out.println(bean2Map(person));
  System.out.println(bean2Map2(person));
  public static Map<String, Object> bean2Map(Object object) {
      Map<String, Object> map = new HashMap<>();
      ReflectionUtils.doWithFields(object.getClass(), field -> {
          field.setAccessible(true);
          Object value = ReflectionUtils.getField(field, object);
          if (value != null) {
              map.put(field.getName(), value);
          }
      });
      return map;
  }
  public static Map<String, Object> bean2Map2(Object object) {
      Map<String, Object> map = new HashMap<>();
      Class<?> clazz = object.getClass();
      Field[] fields = clazz.getDeclaredFields();
      for (Field field : fields) {
          field.setAccessible(true);
          try {
              Object value = field.get(object);
              if (value != null) {
                  map.put(field.getName(), value);
              }
          } catch (IllegalAccessException e) {
              throw new RuntimeException("Error accessing field: " + field.getName(), e);
          }
      }
      return map;
  }
  Map转为Bean
  Map<String, Object> map = new HashMap();
  map.put("age", 18);
  map.put("openid", "123456");
  map.put("name", "一安");
  map.put("subName", "公众号");
  System.out.println(map2Bean(map, Person.class));
  System.out.println(map2Bean2(map, Person.class));
  public static <T> T map2Bean(Map<String, Object> map, Class<T> clazz) throws IllegalAccessException, InstantiationException {
      T instance = clazz.newInstance();
      ReflectionUtils.doWithFields(clazz, field -> {
          field.setAccessible(true);
          if (map.containsKey(field.getName())) {
              ReflectionUtils.setField(field, instance, map.get(field.getName()));
          }
      });
      return instance;
  }
  public static <T> T map2Bean2(Map<String, Object> map, Class<T> clazz) throws IllegalAccessException, InstantiationException {
      T instance = clazz.newInstance();
      Field[] fields = clazz.getDeclaredFields();
      for (Field field : fields) {
          field.setAccessible(true);
          if (map.containsKey(field.getName())) {
              field.set(instance, map.get(field.getName()));
          }
      }
      return instance;
  }
  方法二:使用Hutool工具
  <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.8.5</version>
  </dependency>
  Bean转为Map
  Person person = new Person();
  person.setAge(18);
  person.setOpenid("123456");
  person.setName("一安");
  person.setSubName("公众号");
  Map<String, Object> map = BeanUtil.beanToMap(person);
  Map转为Bean
  Map<String, Object> map = new HashMap();
  map.put("age", 18);
  map.put("openid", "123456");
  map.put("name", "一安");
  map.put("subName", "公众号");
  Person person = BeanUtil.toBean(map, Person.class);
  方法三:使用Jackson工具
  Bean转为Map
  Person person = new Person();
  person.setAge(18);
  person.setOpenid("123456");
  person.setName("一安");
  person.setSubName("公众号");
  System.out.println(bean2Map(person));
  public static Map<String, Object> bean2Map(Object object) {
          ObjectMapper objectMapper = new ObjectMapper();
          return objectMapper.convertValue(object, new TypeReference<Map<String, Object>>() {
          });
      }
  Map转为Bean
  Map<String, Object> map = new HashMap();
  map.put("age", 18);
  map.put("openid", "123456");
  map.put("name", "一安");
  map.put("subName", "公众号");
  System.out.println(map2Bean(map, Person.class));
  public static <T> T map2Bean(Map<String, Object> map, Class<T> clazz){
      ObjectMapper objectMapper = new ObjectMapper();
      return objectMapper.convertValue(map, clazz);
  }
  方法四:使用Apache Commons Lang的BeanUtils
  <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.12.0</version> 
  </dependency>
  Bean转为Map
  Person person = new Person();
  person.setAge(18);
  person.setOpenid("123456");
  person.setName("一安");
  person.setSubName("公众号");
  System.out.println(bean2Map(person));
  public static Map<String, String> bean2Map(Object object) {
      try {
          return BeanUtils.describe(object);
      } catch (Exception e) {
          throw new RuntimeException("Error converting object to map: " + e.getMessage(), e);
      }
  }
  Map转为Bean
  Map<String, Object> map = new HashMap();
  map.put("age", 18);
  map.put("openid", "123456");
  map.put("name", "一安");
  map.put("subName", "公众号");
  System.out.println(map2Bean(map, Person.class));
  public static <T> T map2Bean(Map<String, ?> map, Class<T> clazz) {
      try {
          T instance = clazz.newInstance();
          BeanUtils.populate(instance, map);
          return instance;
      } catch (Exception e) {
          throw new RuntimeException("Error converting map to object: " + e.getMessage(), e);
      }
  }
  方法五:使用fastjson工具
  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.83</version>
  </dependency>
  Bean转为Map
  Person person = new Person();
  person.setAge(18);
  person.setOpenid("123456");
  person.setName("一安");
  person.setSubName("公众号");
  System.out.println(JSONObject.parseObject(JSONObject.toJSONString(person)));
  Map转为Bean
  Map<String, Object> map = new HashMap();
  map.put("age", 18);
  map.put("openid", "123456");
  map.put("name", "一安");
  map.put("subName", "公众号");
  System.out.println(JSONObject.parseObject(JSONObject.toJSONString(map), Person.class));
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2024软件测试行业从业人员调查问卷》,您的见解,行业的声音!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号