开发此方法的业务目的是要开发一个 接收推送提醒接口(我方接口中代码调用下游系统接口要知道成功与否),技术目的是 要降低对接不同系统的开发工作量,还有一个好处是,免去各系统接入消息队列,增加架构复杂度。
鉴于各下游系统对外封装的返回体各不相同,先规定一通用规则,示例如下:
状态码-状态对照:
成功:0-已接收到推送提醒 。
失败:
1- 系统出现问题,请重新推送
成功:0-已接收到推送提醒 。
失败:
1- 系统出现问题,请重新推送
{
"下游系统返回体封装":{
"最底层父节点":{
"code":0,
"msg":"已接收到推送提醒",
"data":""
}
}
}
有了这个规定后 我的接口调用第三方接口并解析就简单了。拿到第三方接口返回体后采用深度递归遍历的方式拿到code对应的值,方法如下,此方法会返回第一次匹配上的key并返回其值。
import com.alibaba.fastjson.JSONObject;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class JsonUtil {
/*
* 描述:获得一串json字符串中某个key的值,采用深度有限遍历,只匹配到一次就返回值
* @param jsonString json字符串
* @param desKey json字符串中某一目标key
*
* */
public static String jsonDepthFirst (String jsonString,String desKey) {
JSONObject jsonObject = JSONObject.parseObject(jsonString);
String desValue0= "";
Set<Map.Entry<String, Object>> set = jsonObject.getInnerMap().entrySet();
Iterator<Map.Entry<String, Object>> iterator = set.iterator();
while(iterator.hasNext()){
Map.Entry<String,Object> entry = iterator.next();
Object value = entry.getValue();
if(value !=null ) {
if(entry.getKey().equals(desKey)) {
String desValue = entry.getValue().toString();
return desValue;
}else {
if(value !=null && value.toString().indexOf("{")!=-1) {
desValue0 = jsonDepthFirst(value.toString(),desKey);
}
}
}
}
return desValue0;
}
}