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比较简单,在此不做赘述。