• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX  ›  程序员

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

  •  
  •   rizon ·
    othorizon · Jul 23, 2019 · 14461 views
    This topic created in 2505 days ago, the information mentioned may be changed or developed.

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

    有什么好用的工具吗?

    31 replies    2019-07-24 22:41:00 +08:00
    jamesliu96
        1
    jamesliu96  
       Jul 23, 2019 via Android
    我以前是自己用反射写,也是苦于找不到能完成需求的工具
    chendy
        2
    chendy  
       Jul 23, 2019
    好奇什么场景…会有这种需求
    BBCCBB
        3
    BBCCBB  
       Jul 23, 2019
    Jackson 就可以
    BBCCBB
        4
    BBCCBB  
       Jul 23, 2019
    有 convert 的 api.
    BBCCBB
        5
    BBCCBB  
       Jul 23, 2019
    或者 dozer 也可以,不过 jackson 就可以满足需求,没必要引入 dozer
    qwerthhusn
        6
    qwerthhusn  
       Jul 23, 2019   ❤️ 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  
       Jul 23, 2019 via Android
    没有太好的,都有很大的性能损耗。不在乎的话,json 就行。或者 beanutils
    在乎的话,mapstruct
    passerbytiny
        8
    passerbytiny  
       Jul 23, 2019
    需求场景几乎不存在,自己用反射写吧。
    qwerthhusn
        9
    qwerthhusn  
       Jul 23, 2019
    @jamesliu96 6 楼满足你的需求
    wysnylc
        10
    wysnylc  
       Jul 23, 2019
    最简单的方式,转成 json 字符串再反序列化
    springmarker
        11
    springmarker  
       Jul 23, 2019
    自己写反射咯,当然还得考虑父类的字段
    leafShimple
        12
    leafShimple  
       Jul 23, 2019
    fastjson 直接用
    letitbesqzr
        13
    letitbesqzr  
       Jul 23, 2019
    hutool 工具类中 BeanUtil.beanToMap

    也是通过反射实现
    cheng6563
        14
    cheng6563  
       Jul 23, 2019 via iPhone
    fastjson 直接转成 JSONObject,就是一个 map
    cheng6563
        15
    cheng6563  
       Jul 23, 2019 via iPhone
    fastjson 转了之后还有一堆入 getIntValue 之类的实用方法,真心觉得 fastjson 的 API 是最好用的了
    CoderGeek
        16
    CoderGeek  
       Jul 23, 2019
    CGLIB BeanMap
    cassyfar
        17
    cassyfar  
       Jul 24, 2019
    Jackson
    Variazioni
        18
    Variazioni  
       Jul 24, 2019
    fastjson 来回倒腾转一下就行。。。挺好用的。。
    fff333
        19
    fff333  
       Jul 24, 2019
    推荐 gson,fast 经常爆漏洞
    HolmLoh
        20
    HolmLoh  
       Jul 24, 2019 via Android
    反射吧,我都是写好抽象类,需要转 map 的话直接继承的
    niaobulashi
        21
    niaobulashi  
       Jul 24, 2019
    ```
    /**
    * 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  
       Jul 24, 2019
    emmmm,评论不能用 md 格式了🐎
    brust
        23
    brust  
       Jul 24, 2019
    Gson,FastJSON
    zhybb2010
        24
    zhybb2010  
       Jul 24, 2019
    不要管性能,速度,拿起 fastjson 就是一套 comb。
    wo0uewjuoi
        25
    wo0uewjuoi  
       Jul 24, 2019
    @fff333 前几个礼拜刚刚按要求升级 fast 版本防漏洞。。。
    netsail
        26
    netsail  
       Jul 24, 2019
    @rizon 可以用 6 楼的方法
    quadrapop
        27
    quadrapop  
       Jul 24, 2019
    6 楼写法挺大佬的
    xuanbg
        28
    xuanbg  
       Jul 24, 2019
    用 json 序列化对象再反序列化成 Map 呀,还要什么自行车。。。话说我们对象复制、对象转换也是这样搞,爽歪歪
    twoyuan
        29
    twoyuan  
       Jul 24, 2019
    Kotlin 的话就定义个扩展函数的事:

    fun Any.objToMap() = this::class.declaredMemberProperties.map { it.name to it.call(this) }.toMap()
    LeeSeoung
        30
    LeeSeoung  
       Jul 24, 2019
    使用 beanutils.describe
    abai
        31
    abai  
       Jul 24, 2019
    BeanMap
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5345 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 98ms · UTC 03:53 · PVG 11:53 · LAX 20:53 · JFK 23:53
    ♥ Do have faith in what you're doing.