需求:针对复杂JSON数据的,多个特定节点的特定值进行批量加值,其他节点的不能动。
1. 使用fastjson的JsonObject,修改HashMap为LinkedHashMap使用链表,保证顺序一致。
private static String jsonFilter(String sFilter) {
JSONObject jsonObj = new JSONObject(new LinkedHashMap());
JSONObject oFilter = jsonObj.parseObject(sFilter);
oFilter = jsonLoop(oFilter);
return oFilter.toString();
}
2. 迭代到我们需要的节点,对value进行的逻辑处理,处理完成后改值。
public static JSONObject jsonLoop(Object object) {
JSONObject jsonObject = null;
if (object instanceof JSONObject) {
jsonObject = (JSONObject) object;
Iterator<Map.Entry<String, Object>> iterator = jsonObject.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Object> en = iterator.next();
String k = en.getKey();
Object v = en.getValue();
if (k.equals("code") || k.equals("modelUpdated")) {
v = regFilter(v);
jsonObject.put(k, v);
} else {
jsonLoop(v);
}
}
}
if (object instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) object;
for (int i = 0; i < jsonArray.size(); i++) {
jsonLoop(jsonArray.get(i));
}
}
return jsonObject;
}
3. 处理逻辑, 正则分组遍历,对特定节点下命中的字段加3。
private static Object regFilter(Object v) {
String vFilter = v.toString();
Pattern p = Pattern.compile("(Hay-01[3-6]-)([0-9]{3})");
Matcher m = p.matcher(vFilter);
//注意:996-999须另作处理
while (m.find()) {
int g1 = Integer.parseInt(m.group(2));
g1 += 3;
String num = String.format("%03d", g1);
String rep = m.group(1) + num;
vFilter = vFilter.replaceAll(m.group(), rep);
}
return (Object) vFilter;
}