如何使用JSON替代多case的switch case 存储查询参数实现动态调用
实现方案说明
完全可以通过JSON存储setquery的入参来消除冗余的switch case分支,这种方案还能大幅提升后续维护效率,新增货币类型无需修改业务代码。
1. 适用场景说明
如果不同货币对应的查询语句结构差异较大,无法通过简单字符串拼接生成,推荐用JSON配置的方案;如果所有查询语句仅货币代码字段不同,其余结构完全一致,可直接用字符串格式化实现,无需额外配置文件,两种方案如下:
方案一:JSON配置存储(适用查询结构差异大的场景)
1.1 准备配置文件
在项目资源目录下新建currency_query_config.json,按键值对格式存储货币代码和对应的查询语句:
{ "GBP": "mutation {GBP}...........", "USD": "mutation {USD}...........", "INR": "mutation {INR}..........." // 剩余42种货币按相同格式补充即可 }
1.2 初始化加载配置
项目启动/类加载时一次性将配置读取到内存Map中,避免每次调用都读取IO影响性能:
import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.InputStream; import java.util.Map; public class CurrencyQueryConfig { private static Map<String, String> currencyQueryMap; // 类加载时初始化配置 static { ObjectMapper objectMapper = new ObjectMapper(); TypeReference<Map<String, String>> typeRef = new TypeReference<Map<String, String>>() {}; try (InputStream inputStream = CurrencyQueryConfig.class.getClassLoader().getResourceAsStream("currency_query_config.json")) { currencyQueryMap = objectMapper.readValue(inputStream, typeRef); } catch (IOException e) { throw new RuntimeException("货币查询配置加载失败", e); } } public static String getQuery(String currency) { return currencyQueryMap.get(currency); } }
1.3 改造原有业务代码
删除原有switch分支,直接读取配置即可:
public static Response postUser(String currency){ String query = CurrencyQueryConfig.getQuery(currency); // 非空校验,避免传入不支持的货币类型 if (query == null) { throw new IllegalArgumentException("不支持的货币类型:" + currency); } Query.setquery(query); // 原有后续业务逻辑保持不变 return Response; }
方案二:字符串格式化(适用所有查询结构完全一致的场景)
如果所有查询语句仅货币代码部分不同,其余内容完全一致,不需要额外JSON文件,直接格式化字符串即可:
public static Response postUser(String currency){ // 通用模板仅需定义一次,%s为货币代码占位符 String queryTemplate = "mutation {%s}..........."; Query.setquery(String.format(queryTemplate, currency)); // 原有后续业务逻辑保持不变 return Response; }
额外优化建议
- 配置文件放在项目
resources目录下,打包时会自动打入jar包,无需额外处理路径 - 后续新增货币类型仅需修改JSON配置,无需修改业务代码,也不需要重新编译业务类
- 可提前做货币类型合法性校验,避免传入不存在的货币代码返回空值
内容的提问来源于stack exchange,提问作者Raghu K
相关产品推荐
相关产品推荐

