Java 代码优化:解析 JSON 并存储告警规则

本文介绍如何优化 Java 代码,将 JSON 数据解析为 Map,并提取告警规则信息存储到数据库。代码采用高效的解析方式,并使用 Redis 缓存数据,提高性能。

代码优化

原始代码存在以下问题:

  1. 递归调用 parseJSON2Map 方法,造成性能损耗。
  2. 代码逻辑复杂,可读性较差。
  3. 没有使用 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('
翻新告警规则参数,清空数据库失败!');
    }
}

优化说明

  1. 使用 for 循环遍历 JSON 对象,避免递归调用,提高效率。
  2. 将代码逻辑拆分成多个方法,提高可读性。
  3. 使用 Redis 缓存数据,减少数据库查询次数,提高性能。

总结

本文介绍了如何优化 Java 代码,将 JSON 数据解析为 Map,并提取告警规则信息存储到数据库。通过使用高效的解析方式和 Redis 缓存数据,可以显著提高代码性能,并降低数据库压力。

希望本文能够帮助大家提升代码质量,提高系统性能。

Java 代码优化:解析 JSON 并存储告警规则

原文地址: https://www.cveoy.top/t/topic/nbtS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录