基于JavaBeanDescriptor的两种反序列化思路

本文介绍了一种将JavaBeanDescriptor转换为Json格式的方法,包括纯手动转换和通过Map结合fastjson转换两种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JavaBeanDescriptor主要是Dubbo泛化调用时使用,在获得返回的JavaBeanDescriptor后转换为Json格式的字符串。

一、纯手动转换

 public static String analysisJavaBeanDescriptor(JavaBeanDescriptor result, StringBuilder param, Boolean isArrayOrCollection) {
        if (Boolean.TRUE.equals(isArrayOrCollection)) {
            param.append("[");
        } else {
            param.append("{");
        }
        if (result.isMapType()) {
            resolveMap(result, param);
        } else {
            for (Map.Entry<Object, Object> next : result) {
                JavaBeanDescriptor value = (JavaBeanDescriptor) next.getValue();
                // 分情况打印key
                if (Boolean.FALSE.equals(isArrayOrCollection)) {
                    param.append("\"").append(next.getKey()).append("\"").append(":");
                } else {
                    // 去除多加的"{"
                    if ('{' == param.charAt(param.length() - 1)) {
                        param.deleteCharAt(param.length() - 1);
                    }
                }
                if (value.isBeanType()) {
                    analysisJavaBeanDescriptor(value, param, false);
                } else if (value.isPrimitiveType()) {
                    resolvePrimitive(value, param);
                } else if (value.isCollectionType() || value.isArrayType()) {
                    analysisJavaBeanDescriptor(value, param, true);
                } else if (value.isMapType()) {
                    param.append("{");
                    resolveMap(value, param);
                    param.deleteCharAt(param.length() - 1);
                    param.append("}");
                } else if (value.isEnumType()) {
                    param.append("\"").append(value.getProperty("name")).append("\"");
                }
                param.append(",");
            }
        }
        param.deleteCharAt(param.length() - 1);
        if (Boolean.TRUE.equals(isArrayOrCollection)) {
            param.append("]");
        } else {
            param.append("}");
        }
        return param.toString();
    }

    /**
     * 处理基本数据类型、包装类、String
     *
     * @param value JavaBeanDescriptor
     * @param param json串
     */
    private static void resolvePrimitive(JavaBeanDescriptor value, StringBuilder param) {
        if (value.getClassName().contains("String")) {
            param.append("\"").append(value.getProperty("value")).append("\"");
        } else {
            param.append(value.getProperty("value"));
        }
    }

    /**
     * 解析map
     *
     * @param value map
     * @param param json串
     */
    private static void resolveMap(JavaBeanDescriptor value, StringBuilder param) {
        for (Map.Entry<Object, Object> entry : value) {
            JavaBeanDescriptor tempValue = (JavaBeanDescriptor) entry.getValue();
            JavaBeanDescriptor key = (JavaBeanDescriptor) entry.getKey();

            if (key.isPrimitiveType()) {
                param.append("\"").append(key.getProperty("value")).append("\"").append(":");
            } else {
                analysisJavaBeanDescriptor(key, param, key.isArrayType() || key.isCollectionType());
            }
            if (tempValue.isPrimitiveType()) {
                param.append("\"").append(tempValue.getProperty("value")).append("\"").append("}");
            } else {
                analysisJavaBeanDescriptor(tempValue, param, key.isArrayType() || key.isCollectionType());
                param.append(",");
            }
        }
    }

二、先转换为Map,再通过fastjson转为Json格式字符串


    /**
     * 利用Map反序列化JavaBeanDescriptor
     * @param result {@link JavaBeanDescriptor}
     * @param param map
     * @return {@link Map<String, Object>}
     */
    public static Map<String, Object> analysisJavaBeanDescriptorByMap(JavaBeanDescriptor result, Map<String, Object> param) {
        if (result.isMapType()) {
            for (Map.Entry<Object, Object> entry : result) {
                JavaBeanDescriptor templeValue = (JavaBeanDescriptor) entry.getValue();
                JavaBeanDescriptor key = (JavaBeanDescriptor) entry.getKey();
                if (!key.isPrimitiveType()) {
                    log.error("Map-Key类型有误");
                    // 抛个异常
                    throw new ServiceException(ExceptionMessageUtil.setComponentType(ComponentExceptionEnum.RPC, "只支持key为基本类型或String的Map"), CommonErrorCode.PARAM_EXCEPTION);
                }
                if (templeValue.isPrimitiveType()) {
                    param.put(key.getProperty("value").toString(), templeValue.getProperty("value"));
                } else {
                    param.put(key.getProperty("value").toString(), analysisJavaBeanDescriptorByMap(templeValue, Maps.newHashMap()));
                }
            }
        } else {
            for (Map.Entry<Object, Object> next : result) {
                JavaBeanDescriptor value = (JavaBeanDescriptor) next.getValue();
                // 基本数据类型
                if (value.isPrimitiveType()) {
                    param.put(next.getKey().toString(), value.getProperty("value"));
                } else if (value.isArrayType() || value.isCollectionType()) {
                    Map<String, Object> map = analysisJavaBeanDescriptorByMap(value, Maps.newHashMap());
                    JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(new ArrayList<>(map.values())));
                    param.put(next.getKey().toString(), jsonArray);
                } else if (value.isMapType()||value.isBeanType()) {
                    param.put(next.getKey().toString(), analysisJavaBeanDescriptorByMap(value, Maps.newHashMap()));
                }else if (value.isEnumType()){
                    param.put(next.getKey().toString(),value.getProperty("name"));
                }
            }
        }
        return param;
    }

将Map转为Json比较简单,在此不做赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值