场景:使用jackson解析接口返回的json字符串时,json字符串格式不统一;
接口返回成功json格式,用jackson解析通过:
{"public_response":{"msg":"success","result":{"order_state":true},"error":1}}
接口返回错误json格式,用jackson解析抛异常:
{"public_response":{"msg":"business activity num control error","result":"","error":-1411}}
result正确时返回对象,错误时返回空串。导致在catch块中写业务逻辑。于是想到fastjson。
代码:JsonUtil.java
public class JsonUtil {
private HashMap<String, Object> resultMap = new HashMap<String, Object>();
public static void main(String[] args) {
String returnStr = "{\"public_response\":{\"msg\":\"business activity num control error\",\"result\":\"\",\"error\":-1411}}";
returnStr = "{\"public_response\":{\"msg\":\"success\",\"result\":{\"order_state\":true},\"error\":1}}";
System.out.println(returnStr);
returnStr = "{\"sign\":\"d6fe0c73cf1ca0ad1e3f13f454835cdc325c4ade6b1929998f4b7932f6ffd950\",\"public_response\":{\"error\":-101,\"msg\":\"签名错误\"}}";
Map<String, Object> s = (Map<String, Object>) JSON.parse(returnStr);
HashMap<String, Object> resultMap = new JsonUtil().parseJsonToMap(s);
System.out.println(resultMap);
}
// 递归
public HashMap<String, Object> parseJsonToMap(Map<String, Object> params) {
for (Map.Entry<String, Object> entry : params.entrySet()) {
Object valueObj = entry.getValue();
if (valueObj instanceof Map) {
parseJsonToMap((Map<String, Object>) valueObj);
} else {
resultMap.put(entry.getKey(), valueObj);
}
}
return resultMap;
}
}
问题解决,避免了在catch块中写业务逻辑。
如果只想获得状态码error或msg,代码如下:
String returnStr = "{\"public_response\":{\"msg\":\"business activity num control error\",\"result\":\"\",\"error\":-1411}}";
//returnStr = "{\"public_response\":{\"msg\":\"success\",\"result\":{\"order_state\":true},\"error\":1}}";
JSONObject jsonObject = JSONObject.parseObject(returnStr);
JSONObject newJsonObj = JSONObject.parseObject(jsonObject.getString("public_response"));
System.out.println(newJsonObj.getString("error"));
System.out.println(newJsonObj.getString("msg"));