Java 对象转 map 有什么好用的工具吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术题时复制粘贴 AI 生成的内容
rizon
V2EX    程序员

Java 对象转 map 有什么好用的工具吗?

  •  
  •   rizon
    othorizon 2019-07-23 17:53:45 +08:00 13973 次点击
    这是一个创建于 2272 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用各种 json 工具先转字符串 json 再转 map 也可以,但是还得处理日期啊什么的这些特殊字符,而且这种方式也很难受啊。

    有什么好用的工具吗?

    31 条回复    2019-07-24 22:41:00 +08:00
    jamesliu96
        1
    jamesliu96  
       2019-07-23 18:05:57 +08:00 via Android
    我以前是自己用反射写,也是苦于找不到能完成需求的工具
    chendy
        2
    chendy  
       2019-07-23 18:07:06 +08:00
    好奇什么场景…会有这种需求
    BBCCBB
        3
    BBCCBB  
       2019-07-23 18:09:14 +08:00
    Jackson 就可以
    BBCCBB
        4
    BBCCBB  
       2019-07-23 18:09:20 +08:00
    有 convert 的 api.
    BBCCBB
        5
    BBCCBB  
       2019-07-23 18:10:10 +08:00
    或者 dozer 也可以,不过 jackson 就可以满足需求,没必要引入 dozer
    qwerthhusn
        6
    qwerthhusn  
       2019-07-23 18:18:37 +08:00   1
    public static Map<String, Object> main(Object args) {
    return Arrays.stream(BeanUtils.getPropertyDescriptors(args.getClass()))
    .filter(pd -> !"class".equals(pd.getName()))
    .collect(HashMap::new,
    (map, pd) -> map.put(pd.getName(), ReflectionUtils.invokeMethod(pd.getReadMethod(), args)),
    HashMap::putAll);
    }

    写的,很简单,前提是用了 JDK8 或者以上,用了 Spring
    cubecube
        7
    cubecube  
       2019-07-23 18:20:33 +08:00 via Android
    没有太好的,都有很大的性能损耗。不在乎的话,json 就行。或者 beanutils
    在乎的话,mapstruct
    passerbytiny
        8
    passerbytiny  
       2019-07-23 18:23:23 +08:00
    需求场景几乎不存在,自己用反射写吧。
    qwerthhusn
        9
    qwerthhusn  
       2019-07-23 18:24:28 +08:00
    @jamesliu96 6 楼满足你的需求
    wysnylc
        10
    wysnylc  
       2019-07-23 19:54:15 +08:00
    最简单的方式,转成 json 字符串再反序列化
    springmarker
        11
    springmarker  
       2019-07-23 20:40:28 +08:00
    自己写反射咯,当然还得考虑父类的字段
    leafShimple
        12
    leafShimple  
       2019-07-23 20:54:54 +08:00
    fastjson 直接用
    letitbesqzr
        13
    letitbesqzr  
       2019-07-23 22:05:04 +08:00
    hutool 工具类中 BeanUtil.beanToMap

    也是通过反射实现
    cheng6563
        14
    cheng6563  
       2019-07-23 22:30:22 +08:00 via iPhone
    fastjson 直接转成 JSONObject,就是一个 map
    cheng6563
        15
    cheng6563  
       2019-07-23 22:32:11 +08:00 via iPhone
    fastjson 转了之后还有一堆入 getIntValue 之类的实用方法,真心觉得 fastjson 的 API 是最好用的了
    CoderGeek
        16
    CoderGeek  
       2019-07-23 22:39:47 +08:00
    CGLIB BeanMap
    cassyfar
        17
    cassyfar  
       2019-07-24 03:02:01 +08:00
    Jackson
    Variazioni
        18
    Variazioni  
       2019-07-24 08:30:49 +08:00
    fastjson 来回倒腾转一下就行。。。挺好用的。。
    fff333
        19
    fff333  
       2019-07-24 09:12:14 +08:00
    推荐 gson,fast 经常爆漏洞
    HolmLoh
        20
    HolmLoh  
       2019-07-24 09:22:07 +08:00 via Android
    反射吧,我都是写好抽象类,需要转 map 的话直接继承的
    niaobulashi
        21
    niaobulashi  
       2019-07-24 09:37:51 +08:00
    ```
    /**
    * java bean 转 Map
    * @param bean
    * @param propNames 需要放到 map 中的属性名称
    * @return
    */
    public static Map<String,Object> beanToMap(Object bean, String...propNames) {
    Map<String,Object> rtn = new HashMap<String,Object>();
    if(ArrayUtils.isEmpty(propNames)){
    List<String> fieldNames = getFieldNames(bean.getClass());
    for (String fieldName: fieldNames) {
    Object value = getProperty(bean, fieldName);
    rtn.put(fieldName, value);
    }
    }else{
    for(String propName: propNames){
    Object value = getProperty(bean, propName);
    rtn.put(propName, value);
    }
    }
    return rtn;
    }
    ```
    niaobulashi
        22
    niaobulashi  
       2019-07-24 09:39:21 +08:00
    emmmm,评论不能用 md 格式了
    brust
        23
    brust  
       2019-07-24 09:44:36 +08:00
    Gson,FastJSON
    zhybb2010
        24
    zhybb2010  
       2019-07-24 10:23:58 +08:00
    不要管性能,速度,拿起 fastjson 就是一套 comb。
    wo0uewjuoi
        25
    wo0uewjuoi  
       2019-07-24 10:32:47 +08:00
    @fff333 前几个礼拜刚刚按要求升级 fast 版本防漏洞。。。
    netsail
        26
    netsail  
       2019-07-24 13:15:46 +08:00
    @rizon 可以用 6 楼的方法
    quadrapop
        27
    quadrapop  
       2019-07-24 13:52:43 +08:00
    6 楼写法挺大佬的
    xuanbg
        28
    xuanbg  
       2019-07-24 13:56:43 +08:00
    用 json 序列化对象再反序列化成 Map 呀,还要什么自行车。。。话说我们对象复制、对象转换也是这样搞,爽歪歪
    twoyuan
        29
    twoyuan  
       2019-07-24 14:24:43 +08:00
    Kotlin 的话就定义个扩展函数的事:

    fun Any.objToMap() = this::class.declaredMemberProperties.map { it.name to it.call(this) }.toMap()
    LeeSeoung
        30
    LeeSeoung  
       2019-07-24 14:30:03 +08:00
    使用 beanutils.describe
    abai
        31
    abai  
       2019-07-24 22:41:00 +08:00
    BeanMap
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2190 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 00:40 PVG 08:40 LAX 17:40 JFK 20:40
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86