Object转成map对象_嘤嘤樱桃小丸子的博客-程序员宝宝_object转成map

技术标签: JAVAWEB学习  java  map  Date  object  

1、Object转换成map的方法

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;


/**
     * 将Object对象里面的属性和值转化成Map对象
     *
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    public static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException {
        Map<String, Object> map = new HashMap<String,Object>();
        Class<?> clazz = obj.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            String fieldName = field.getName();
            Object value = field.get(obj);
            map.put(fieldName, value);
        }
        return map;
    }

2、转换前的数据格式

SearchHit{id='awQWpXgBwGXBeoctg1F5', score=2.1747518, sortValues=[], content=User(id=awQWpXgBwGXBeoctg1F5, name=吴京, msg=我是演员, job=演员, sex=男, age=12, createDate=Tue Apr 06 08:00:00 CST 2021), highlightFields={}}

3、转换后的数据

{score=2.1747518, innerHits={}, highlightFields={}, index=user, id=awQWpXgBwGXBeoctg1F5, nestedMetaData=null, sortValues=[], content=User(id=awQWpXgBwGXBeoctg1F5, name=吴京, msg=我是演员, job=演员, sex=男, age=12, createDate=Tue Apr 06 08:00:00 CST 2021)}

4、取map中的值

map.get("content")

5、map转实体对象

List searchHits = user.getSearchHits();

List<User> users = new ArrayList<>();
        for (Object o : searchHits) {
            Map<String, Object> map = new HashMap<>();
            map = objectToMap(o);
            Map<String, Object> userMap = objectToMap(map.get("content"));
            User user1 = mapToBean(userMap);
            System.out.println("哈哈哈哈哈转换成功:"+user1.getMsg());
            users.add(user1);
        }

6、map转实体类对象利用的方法

参数类型按实际的实体类进行增加

/**
     * map 转 实体类
     *
     * @param map
     * @return
     * @throws Exception
     */
    public User mapToBean(Map<String, Object> map)
            throws Exception {
        User permission = new User();
        if (map != null) {
            Field[] declaredFields = User.class.getDeclaredFields();
            if (declaredFields != null) {

                for (Field declaredField : declaredFields) {
                    declaredField.setAccessible(true);
                    Set<String> mapKeys = map.keySet();

                    for (String mapKey : mapKeys) {

                        if (declaredField.getType().toString().contains("Integer"))//判断属性类型 进行转换,map中存放的是Object对象需要转换 实体类中有多少类型就加多少类型,实体类属性用包装类;
                            if (declaredField.getName().equals(mapKey)) {
                                declaredField.set(permission, Integer.valueOf(map.get(mapKey).toString()));
                                break;
                            }
                        if (declaredField.getType().toString().contains("String"))//判断属性类型 进行转换;
                            if (declaredField.getName().equals(mapKey)) {
                                declaredField.set(permission, map.get(mapKey));

                                break;
                            }
                        if (declaredField.getType().toString().contains("Float"))//判断属性类型 进行转换;
                            if (declaredField.getName().equals(mapKey)) {
                                declaredField.set(permission, Float.valueOf(map.get(mapKey).toString()));

                                break;
                            }

                        if (declaredField.getType().toString().contains("Long"))//判断属性类型 进行转换;
                            if (declaredField.getName().equals(mapKey)) {
                                declaredField.set(permission, Long.valueOf(map.get(mapKey).toString()));
                                break;
                            }

                        if (declaredField.getType().toString().contains("Date"))//判断属性类型 进行转换;
                            if (declaredField.getName().equals(mapKey)) {
                                String s = map.get(mapKey).toString();
                                Date parse = parse(s, "EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
                                declaredField.set(permission, parse);
                                break;
                            }

                    }
                }
            }

        }

        return permission;

7、里面用到的时间格式是格林威治,实体类存的是Date,具体方法如下:

// 格林威治时间转Date
    private Date parse(String str, String pattern, Locale locale) {
        if (str == null || pattern == null) {
            return null;
        }
        try {
            return new SimpleDateFormat(pattern, locale).parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }

8、完整代码在下面,因为我用的是springboot+es,所以,根据具体情况灵活变动

package com.springboot.demo.es;

import com.springboot.demo.entity.User;
import com.springboot.demo.mapper.UserResipotry;
import org.apache.tomcat.util.buf.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.SearchHits;
import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
import org.springframework.data.elasticsearch.core.query.GetQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;

import javax.xml.crypto.Data;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @author dt
 * @date 2021年04月06日10:47
 */
@SpringBootTest
public class EsDemo01 {


    @Autowired
    private ElasticsearchRestTemplate elasticsearchRestTemplate;

   
    @Test
    void test4() throws Exception {

        //组合条件对象
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        boolQuery.must(QueryBuilders.matchQuery("name", "吴京"));

        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        nativeSearchQueryBuilder.withQuery(boolQuery);
        SearchHits user = elasticsearchRestTemplate.search(nativeSearchQueryBuilder.build(), User.class, IndexCoordinates.of("user"));
        List searchHits = user.getSearchHits();

        List<User> users = new ArrayList<>();
        for (Object o : searchHits) {
            Map<String, Object> map = new HashMap<>();
            map = objectToMap(o);
            Map<String, Object> userMap = objectToMap(map.get("content"));
            User user1 = mapToBean(userMap);
            System.out.println("哈哈哈哈哈转换成功:"+user1.getMsg());
            users.add(user1);
        }

        System.out.println(users);

    }


    /**
     * 将Object对象里面的属性和值转化成Map对象
     *
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    public static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException {
        Map<String, Object> map = new HashMap<String, Object>();
        Class<?> clazz = obj.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            String fieldName = field.getName();
            Object value = field.get(obj);
            map.put(fieldName, value);
        }
        return map;
    }


    /**
     * map 转 实体类
     *
     * @param map
     * @return
     * @throws Exception
     */
    public User mapToBean(Map<String, Object> map)
            throws Exception {
        User permission = new User();
        if (map != null) {
            Field[] declaredFields = User.class.getDeclaredFields();
            if (declaredFields != null) {

                for (Field declaredField : declaredFields) {
                    declaredField.setAccessible(true);
                    Set<String> mapKeys = map.keySet();

                    for (String mapKey : mapKeys) {

                        if (declaredField.getType().toString().contains("Integer"))//判断属性类型 进行转换,map中存放的是Object对象需要转换 实体类中有多少类型就加多少类型,实体类属性用包装类;
                            if (declaredField.getName().equals(mapKey)) {
                                declaredField.set(permission, Integer.valueOf(map.get(mapKey).toString()));
                                break;
                            }
                        if (declaredField.getType().toString().contains("String"))//判断属性类型 进行转换;
                            if (declaredField.getName().equals(mapKey)) {
                                declaredField.set(permission, map.get(mapKey));

                                break;
                            }
                        if (declaredField.getType().toString().contains("Float"))//判断属性类型 进行转换;
                            if (declaredField.getName().equals(mapKey)) {
                                declaredField.set(permission, Float.valueOf(map.get(mapKey).toString()));

                                break;
                            }

                        if (declaredField.getType().toString().contains("Long"))//判断属性类型 进行转换;
                            if (declaredField.getName().equals(mapKey)) {
                                declaredField.set(permission, Long.valueOf(map.get(mapKey).toString()));
                                break;
                            }

                        if (declaredField.getType().toString().contains("Date"))//判断属性类型 进行转换;
                            if (declaredField.getName().equals(mapKey)) {
                                String s = map.get(mapKey).toString();
                                Date parse = parse(s, "EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
                                declaredField.set(permission, parse);
                                break;
                            }

                    }
                }
            }

        }

        return permission;
    }


    @Test
    public void getTime() throws ParseException {
        String str = "Tue Apr 06 08:00:00 CST 2021";
        Date date = parse(str, "EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);

    }

    // 格林威治时间转Date
    private Date parse(String str, String pattern, Locale locale) {
        if (str == null || pattern == null) {
            return null;
        }
        try {
            return new SimpleDateFormat(pattern, locale).parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

9、那些转换方法都可以单独用

参考文章链接:

https://blog.csdn.net/qq_15204179/article/details/86677123

https://www.cnblogs.com/zktww/p/14296407.html

https://www.cnblogs.com/tobeymarshall/p/10217410.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43163943/article/details/115489919

智能推荐

面试题随手练习(一)_小鹿在努力的博客-程序员宝宝

昨天小张哥面试,有四道上机题,我也想尝试着做做,就当解闷儿了,但是在做的过程中,还是发现了基础薄弱的地方。第一道题:算自由落体运动的弹力球,经过10次反弹后(每次消耗1/2能量)弹起的高度,以及经过的路程。思路:1.如果从10米落下,在弹起的高度就是5米,2.5米。。。 2.求和的次数比10次少一次,因为定义的sum初值就是球的初始高度容易出错的地方:1.每次加的1/2前一次的高度,开始我写的是递

几种经典的网络服务器架构模型的分析与比较_江南好风景的博客-程序员宝宝

本文转自:http://blog.jobbole.com/42895/                                    几种经典的网络服务器架构模型的分析与比较前言事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用;事实上,在网络编程中事件驱动也被广泛使用,并大规模部署在高连接数高吞吐量的服务器程序中,如 http 服务器程序、ftp

第八周项目2-Time类中的运算符重载_Hades_Dev的博客-程序员宝宝

实现Time类中的运算符重载。class CTime{private: unsigned short int hour; // 时 unsigned short int minute; // 分 unsigned short int second; // 秒public: CTime(int h=0,int m=0,int s=0); v

【解决问题】-bash: pm2: command not found_lifankeke的博客-程序员宝宝_-bash: pm2: 未找到命令

今天在腾讯云服务器上新装了pm2之后报错:-bash: pm2: command not found通常这种问题都是因为$PATH变量查看$PATH变量echo $PATH建立linkln pm2位置 /usr/local/bin/pm2pm2位置 可以在 npm install pm2 -g 的信息中看到:failed to create symbolic link '/usr/local/bin/pm2':File exists上面第二步骤...

面向对象:绑定方法和非绑定方法_dongdui7481的博客-程序员宝宝

阅读目录一 类中定义的函数分成两大类二 绑定方法三 非绑定方法四 classmethod与staticmethod的区别五 练习一 类中定义的函数分成两大类一:绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入):    1. 绑定到类的方法:用classmethod装饰器装饰的方法。 为类量身定制...

Android挂逼修练之行---微信中把朋友圈封面设置成酷炫视频功能插件开发详解_尼古拉斯.赵四的博客-程序员宝宝

一、背景介绍最近在刷抖音的时候看见别人发了一个可以把微信朋友圈封面图设置成视频的功能,比较好奇就自己研究了一下,最开始的时候第一灵感就是是不是微信设置封面图的接口有后门,就是微信为了后续功能扩展,服务端是支持上传视频的,但是客户端是没有做这个功能开发的,通过这么想之后就立马去实践查看之后发现并没有这个开发后门,那到底是怎么实现的呢?二、开发思路后续苦想之后可能觉得是本地生成一个假...

随便推点

Python基础刻意练习——Day17:模块_nanashi_F的博客-程序员宝宝

Python基础刻意练习——Day17:模块 | 一、模块的导入 | 二、搜索路径 | if __name__ == '__main__' | 四、包 |

android系统通过图片绝对路径获取URI的三种方法_詹小布的博客-程序员宝宝

最近做项目要通过图片的绝对路径找到图片的URI,然后删除图片,小小总结一下获取URI的方法,亲自试验在android 4.1.3的系统上都是可用的。1.将所有的图片路径取出,遍历比较找到需要的路径,取出URI,效率较低其中 MediaStore.MediaColumns.DATA 字段存的就是图片的绝对路径,最后mImageUri得到的就是图片的URI 1 Uri m...

条件语句不要嵌套太多层次_sxdtzhp的博客-程序员宝宝

<br />条件语句不要嵌套太多层次<br />  if语句嵌套层次太多后可读性很差,修改时容易改错。如果缩进不正确,很容易就看错了。<br />  一般一段代码会有多个有效性判断,只有合法后才执行主体业务逻辑。有以下两种写法:<br />  (1)嵌套法<br />     if 条件1 then<br />      if 条件2 then<br />       执行主体业务逻辑<br />      else<br />       错误2<br />       return false<br /

小米4a电视连接群晖218+记录#01_yhm2046的博客-程序员宝宝_小米电视连接群晖nas

步骤:android手机的群晖管家apk使用qq提取保存到电脑A U盘拷贝A中的群晖管家到4A 4A安装群晖管家 保证4A和218+在同一网络 拷贝电影在群晖driver目录下 从4A中直接播放电影...

学习pysot避坑2_电路助攻的博客-程序员宝宝

前面我们验证在OTB数据集上进行了验证下面我们在VOT2018数据集中进行了测试下面是VOT2018数据集链接:https://pan.baidu.com/s/10re5C5hdDAMXfT1Sy_atiw提取码:h2dl其中一些问题我做 下总结其中demo和OTB中是一样的在运行test.py中报错...

Android ID详解_iteye_7514的博客-程序员宝宝

Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id。id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc、@+id/xyz等。如果在@后面使用“+”,表示当修改完某个布局文件并保存后,系统会自动在R.java文件中生成对应的int类型变量。变量名就是“/”后面的值,例如,@+id/xyz会在R.java文件中生成intxyz = value...