V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX  ›  程序员

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

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

    使用各种 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
    guoluwei
        31
    guoluwei  
       2019-07-24 22:41:00 +08:00
    BeanMap
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5308 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:49 · PVG 13:49 · LAX 21:49 · JFK 00:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.