SOFA 泛化调用后,格式化(type、fields)与其他rest请求数据一致

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请求返回的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值