需求:我想接入任意第三方http 接口(暂不考虑鉴权问题)、接口返回任意json数据。
1、要求返回的json数据通过我的R< T > 返回。
2、我的R< T > 里面包含参数 data,code,msg,success标识。
3、我的R< T > 里面的参数 data 匹配第三方接口的data,code匹配三方接口的code,msg匹配第三方接口的msg。
实现
@RestController
public class JsonDataExtractor {
@PostMapping("/extplorJSON")
public Object extplor() {
//模拟接口返回数据
String jsonString = "[{\n" +
" \"codeN\": 200,\n" +
" \"success\": true,\n" +
" \"date\": [{\n" +
" \"ALLCOUNT\": \"5\",\n" +
" \"ALLSUM\": \"6000\"\n" +
" }],\n" +
" \"msg\": \"操作成功\"\n" +
"}\n" +
"]";
//1、成功code映射字符串标识
String code = "codeN";
//2、成功code标识码
String codeNumber = "200";
//3、接口返回数据字符串标识
String data = "date";
//4、接口返回内容描述
String msg = "msg";
//todo 1 2 3 4 替换为数据库查询
// 模拟返回 R<T>
Map<String,Object> restMap = new HashMap<>();
restMap.put("success",true);
restMap.put("code",200);
restMap.put("msg","成功");
ObjectMapper mapper = new ObjectMapper();
try {
JsonNode rootNode = mapper.readTree(jsonString);
//判断code是否返回
Object codeContent = findData(rootNode, code);
if (codeContent != null) {
String codeStr = codeContent.toString();
if (StringUtils.isEmpty(codeStr) || !codeStr.equals(codeNumber)) {
restMap.put("success",false);
restMap.put("code",400);
restMap.put("msg",findData(rootNode, msg));
restMap.put("data",null);
return restMap;
}
}
//code码通过,获取回显内容
Object dataContent = findData(rootNode, data);
if (dataContent != null) {
restMap.put("data",dataContent);
} else {
restMap.put("success",false);
restMap.put("code",400);
restMap.put("msg",data+"未找到");
restMap.put("data",null);
}
} catch (IOException e) {
e.printStackTrace();
restMap.put("success",false);
restMap.put("code",400);
restMap.put("msg","失败");
restMap.put("data",null);
}
return restMap;
}
public static Object findData(JsonNode node,String datas){
try {
if (node.has(datas)) {
return node.get(datas);
} else if (node.isObject() || node.isArray()) {
for (JsonNode child : node) {
Object data = findData(child,datas);
if (data != null) {
return data;
}
}
}
}catch (Exception e){
}
return null;
}
}
返回的数据就变成了