最近碰到个需求,需求其中有个环节需要对一个json字符串其中的value值做解密处理,也就是这个json字符串不能对应到那个对象,但是需要找出里面的value值并对其进行修改。
所以做了个小递归处理,进行记录,具体实现方式如下:
public JSONObject analyseJson(String jsonData) {
JSONObject jsonObjectResult = new JSONObject();
//把传入String类型转换成JSONObject对象
JSONObject jsonObject = JSON.parseObject(jsonData);
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
String key = entry.getKey();
//如果value依旧是json类型的话继续递归解析
if (!StringUtils.isEmpty(String.valueOf(entry.getValue())) && isJSON(entry.getValue().toString())) {
jsonObjectResult.put(key, analyseJson(entry.getValue().toString()));
} else {
//如果value是单纯的数据,则直接封装
jsonObjectResult.put(key, entry.getValue());
}
}
return jsonObjectResult;
}
其中会引用到一个方法isJSON,也就是判断这个value是不是json格式,也就是说如果有嵌套格式的json类型,具体方法如下:
/**
* 判断传入的参数是否为json格式
* @param str
* @return
*/
public boolean isJSON(String str) {
boolean result;
try {
JSON.parse(str);
result = true;
} catch (Exception e) {
result = false;
}
return result;
}
测试结果:
完整代码案例:
public static void main(String[] args) {
String normal = "{\"test\":\"A\"}";
System.out.println("测试普通的json结果:"+analyseJson(normal));
String mulipte = "{\"test\":\"A\",\"test1\":{\"key\":{\"key1\":\"B\"}}}";
System.out.println("测试嵌套的json结果:"+analyseJson(mulipte));
}
/**
* 解析json字符串,普通和嵌套类型都可
* @param jsonData
* @return
*/
public static JSONObject analyseJson(String jsonData) {
JSONObject jsonObjectResult = new JSONObject();
//把传入String类型转换成JSONObject对象
JSONObject jsonObject = JSON.parseObject(jsonData);
for (Map.Entry<String, Object> entry : jsonObject.entrySet()) {
String key = entry.getKey();
//如果value依旧是json类型的话继续递归解析
if (!StringUtils.isEmpty(String.valueOf(entry.getValue())) && isJSON(entry.getValue().toString())) {
jsonObjectResult.put(key, analyseJson(entry.getValue().toString()));
} else {
//如果value是单纯的数据,则直接封装
jsonObjectResult.put(key, "test"+entry.getValue());
}
}
return jsonObjectResult;
}
/**
* 判断传入的参数是否为json格式
* @param str
* @return
*/
public static boolean isJSON(String str) {
boolean result;
try {
JSON.parse(str);
result = true;
} catch (Exception e) {
result = false;
}
return result;
}
完毕!