1. 问题现状
1.1. sofa服务返回的数据
{
"type": "com.wish.plat.base.api.model.RoleResponceBody",
"fields": {
"data": {
"type": "com.wish.plat.base.api.model.form.RoleData",
"fields": {
"business": {
"list": [
{
"type": "com.wish.plat.base.api.model.form.RoleData",
"fields": {
"business": null,
"common": null,
"pageState": null,
"role_code": "ocde1",
"role_id": "id1",
"role_name": "角色A"
}
},
{
"type": "com.wish.plat.base.api.model.form.RoleData",
"fields": {
"business": null,
"common": null,
"pageState": null,
"role_code": "ocde2",
"role_id": "id2",
"role_name": "角色B"
}
}
]
},
"common": null,
"pageState": null,
"role_code": null,
"role_id": null,
"role_name": null
}
}
}
}
1.2. 正常rest返回的数据
{
"data": {
"common": null,
"business": {
"list": [
{
"common": null,
"business": null,
"pageState": null,
"role_id": "id1",
"role_code": "ocde1",
"role_name": "角色A"
},
{
"common": null,
"business": null,
"pageState": null,
"role_id": "id2",
"role_code": "ocde2",
"role_name": "角色B"
}
]
},
"pageState": null,
"role_id": null,
"role_code": null,
"role_name": null
}
}
1.3. 结论
为了不影响前端程序,更好适配现有系统。因此,需要在网关统一处理。
2. 解决步骤
2.1. 将sofa泛化的返回值调整为正常的JSON格式
/**
* 将sofa泛化的返回值调整为正常的JSON格式
* 总入口
* @param sofaMap
* @return
*/
private Map<String, Object> clearSOFAData(Map<String, Object> sofaMap){
Map<String, Object> resultMap = new HashMap<String, Object>();
for (String key: sofaMap.keySet()){
Object v = sofaMap.get(key);
if (v instanceof GenericObject){
// 如果是sofa对象
GenericObject sofaObj = (GenericObject) v;
resultMap.put(key, clearSOFAData(sofaObj.getFields()));
}else if (v instanceof Map) {
// 如果是内嵌对象
Map<String, Object> otherMap = (Map) v;
resultMap.put(key, clearSOFAData(otherMap));
}else if (v instanceof ArrayList) {
// 如果数组对象
List<Map<String, Object>> list = array2List((ArrayList)v);
resultMap.put(key, list);
}else {
// 如果是基础类型
resultMap.put(key, v);
}
}
return resultMap;
}
2.2. 建一个数组对象转为List
/**
* 建一个数组对象转为List
* @param list
* @return
*/
private List array2List(ArrayList list){
List retList = new ArrayList();
if(list!=null||list.size()!=0) {
for (int i = 0; i < list.size(); i++) {
Object one = clearSOFADataInList(list.get(i));
retList.add(one);
}
}
return retList;
}
2.3. 处理集合里边的对象
/**
* 处理集合里边的对象
* @param v
* @return
*/
private Object clearSOFADataInList(Object v){
if (v instanceof GenericObject){
// 如果是sofa对象
GenericObject sofaObj = (GenericObject) v;
// 如果集合里的对象继续嵌套sofa对象
return clearSOFAData(sofaObj.getFields());
}else {
// 如果是基础类型
return v.toString();
}
}
2.4. 格式化sofa返回的数据,总入口
/**
* 格式化sofa返回的数据
* QX 20190814
*/
Map<String, Object> resultMap = clearSOFAData(genericObject.getFields());
// 在返回后转JSON
String result = JSONObject.fromObject(resultMap).toString();
3. 处理后
同rest请求返回的数据。