好了,问题原因已经定位到了,原因就是返回的报文和预期不一致导致的。
如果按照原来的思路也可以实现,就是按照如下思路一个一个往下套,这样很麻烦也不优雅,而且还会有NullPointerException的case,所以不推荐,这里蚂蚁大佬(P7)给了一个方案就是使用JSONPath,说实话还是第一次听说这个。
map.put("cardId", item.get("fileds").get("cardId"));
JSONPath可以通过你的路径去匹配字段,如果匹配不到就会返回null,且不继续遍历寻找。
代码如下:
def static getFirstOpportunityCardInfo(Object opportunityCardList) {
// 先转为List<JSONObject>
List<JSONObject> opportunityCardListTemp = JSONArray.parseArray(JSON.toString(opportunityCardList), JSONObject.class);
// 处理 opportunityCardList
Map<String, Object> firstOpportunityCard = new HashMap<>();
if (Objects.nonNull(opportunityCardListTemp) && opportunityCardListTemp.size() > 0) {
JSONObject item = opportunityCardListTemp.get(0);
String cardId = JSONPath.eval(item, '$.fields.cardId');
String optionDesc = JSONPath.eval(item, '$.fields.feedbackList[0].fields.optionDesc');
String sceneName = JSONPath.eval(item, '$.fields.sceneName');
// 这里是业务逻辑,可以不看,只看上面取值部分即可
def opportunityCards = new ArrayList<Map<String, String>>();
def sceneNames = new ArrayList<String>();
Map<String, String> map = new HashMap<String, String>();
map.put("cardId", cardId);
map.put("feedback", optionDesc);
opportunityCards.add(map);
sceneNames.add(sceneName);
firstOpportunityCard.put("opportunityCards", opportunityCards);
firstOpportunityCard.put("sceneNames", sceneNames);
}
return firstOpportunityCard;
}
这样写就优雅很多了。
测试方法
static void main(String[] args) {
String str = "[\n" +
" {\n" +
" \"type\": \"com.xxx.xxxx.xxxxx.facade.response.XXXXXX\",\n" +
" \"fields\": {\n" +
" \"cardId\": \"123456789\",\n" +
" \"feedbackList\": [\n" +
" {\n" +
" \"type\": \"com.xxx.xxxx.xxxxx.facade.response.XXXXXXRequest\",\n" +
" \"fields\": {\n" +
" \"closeOpportunity\": true,\n" +
" \"optionDesc\": \"关闭\"\n" +
" }\n" +
" },\n" +
" {\n" +
" \"type\": \"com.xxx.xxxx.xxxxx.facade.response.XXXXXXFeedbackOption\",\n" +
" \"fields\": {\n" +
" \"closeOpportunity\": false,\n" +
" \"optionDesc\": \"不关闭\"\n" +
" }\n" +
" }\n" +
" ],\n" +
" \"sceneName\": \"测试场景-test\"\n" +
" }\n" +
" }\n" +
"]";
def info = getFirstOpportunityCardInfo(JSONArray.parseArray(str));
println(info)
}