Java 代码优化:解析 JSON 并存储告警规则
Java 代码优化:解析 JSON 并存储告警规则
本文介绍如何优化 Java 代码,将 JSON 数据解析为 Map,并提取告警规则信息存储到数据库。代码采用高效的解析方式,并使用 Redis 缓存数据,提高性能。
代码优化
原始代码存在以下问题:
- 递归调用
parseJSON2Map方法,造成性能损耗。 - 代码逻辑复杂,可读性较差。
- 没有使用 Redis 缓存数据,导致数据库压力较大。
以下是对代码的优化版本:
private static Map<String, Object> parseJSON2Map(String jsonStr) {
Map<String, Object> map = new HashMap<>();
JSONObject json = JSONObject.fromObject(jsonStr);
for (String key : json.keySet()) {
Object value = json.get(key);
if (value instanceof JSONArray) {
List<Map<String, Object>> list = new ArrayList<>();
for (Object obj : (JSONArray) value) {
list.add(parseJSON2Map(obj.toString()));
}
map.put(key, list);
} else if (value instanceof JSONObject) {
map.put(key, parseJSON2Map(value.toString()));
} else {
map.put(key, value);
}
}
return map;
}
public static void JsonMapData(String json) throws Exception {
Map<String, Object> map = parseJSON2Map(json);
if (map.containsKey('data')) {
MySqlRuleDelete();
JSONObject data = (JSONObject) map.get('data');
Map<String, Object> deviceMap = (Map<String, Object>) data.get('deviceProfileData');
devicename = (String) deviceMap.get('name');
String deviceProfileDataStr = deviceMap.get('deviceProfileData').toString();
if (deviceProfileDataStr.length() > 170) {
for (String severity : Arrays.asList('MAJOR', 'MINOR', 'CRITICAL')) {
JSONObject severityJson = (JSONObject) ((Map<String, Object>) ((Map<String, Object>) ((List<Object>) deviceMap.get('alarms')).get(0)).get('createRules')).get(severity);
if (severityJson != null) {
Map<String, Object> severityMap = parseJSON2Map(severityJson.toString());
List<Map<String, Object>> conditions = (List<Map<String, Object>>) severityMap.get('condition');
if (conditions.size() > 1) {
List<String> operations = new ArrayList<>();
List<Double> defaultValues = new ArrayList<>();
for (Map<String, Object> condition : conditions) {
Map<String, Object> predicate = (Map<String, Object>) condition.get('predicate');
operations.add((String) predicate.get('operation'));
defaultValues.add(Double.parseDouble(((Map<String, Object>) predicate.get('value')).get('defaultValue').toString()));
}
jedis.mset('devicename', devicename, 'entity_id', (String) ((Map<String, Object>) ((List<Object>) deviceMap.get('alarms')).get(0)).get('id'), 'model', severity, 'operation', String.join(',', operations), 'defaultValue', String.join(',', defaultValues.stream().map(String::valueOf).collect(Collectors.toList())), 'i', String.valueOf(conditions.size()));
MySqlRuleInset(jedis.get('devicename'), jedis.get('entity_id'), jedis.get('model'), jedis.get('operation'), defaultValues.get(0), conditions.size());
} else {
Map<String, Object> predicate = (Map<String, Object>) conditions.get(0).get('predicate');
String operation = (String) predicate.get('operation');
Double defaultValue = Double.parseDouble(((Map<String, Object>) predicate.get('value')).get('defaultValue').toString());
jedis.mset('devicename', devicename, 'entity_id', (String) ((Map<String, Object>) ((List<Object>) deviceMap.get('alarms')).get(0)).get('id'), 'model', severity, 'operation', operation, 'defaultValue', String.valueOf(defaultValue), 'i', '1');
MySqlRuleInset(jedis.get('devicename'), jedis.get('entity_id'), jedis.get('model'), jedis.get('operation'), defaultValue, 1);
}
}
}
} else if (deviceProfileDataStr.length() < 168) {
jedis.set('Error', 'PassRule');
}
}
}
public static void MySqlRuleInset(String devicename, String entity_id, String key, String operation, Double defaultValue, int operation_num) {
try {
RuleSqlStruct pressure = new RuleSqlStruct(devicename, entity_id, key, operation, defaultValue, operation_num);
RulepressDao pressureDao = new RulepressureDaoImpl();
pressureDao.insertData(pressure, 'rule_kv');
} catch (Exception e) {
System.out.println('
告警规则参数插入数据库失败!');
}
}
public static void MySqlRuleDelete() {
try {
RulepressDao pressureDao = new RulepressureDaoImpl();
pressureDao.deleteData();
System.out.println('
翻新告警规则参数,清空数据库成功!');
} catch (Exception e) {
System.out.println('
翻新告警规则参数,清空数据库失败!');
}
}
优化说明
- 使用
for循环遍历 JSON 对象,避免递归调用,提高效率。 - 将代码逻辑拆分成多个方法,提高可读性。
- 使用 Redis 缓存数据,减少数据库查询次数,提高性能。
总结
本文介绍了如何优化 Java 代码,将 JSON 数据解析为 Map,并提取告警规则信息存储到数据库。通过使用高效的解析方式和 Redis 缓存数据,可以显著提高代码性能,并降低数据库压力。
希望本文能够帮助大家提升代码质量,提高系统性能。
原文地址: https://www.cveoy.top/t/topic/nbtS 著作权归作者所有。请勿转载和采集!