基于所选环境实现JSON反序列化的构造器调用方案咨询
基于环境的JSON反序列化实现方案
1. 调整实体类 P
实体类只需对应JSON中的字段,无需将环境参数纳入构造器,Jackson可自动完成属性映射:
public class P { private String customerName; private String customerAddr; private String currency; // Jackson反序列化默认需要无参构造 public P() {} // 可选带参构造,用于手动创建对象 public P(String customerName, String customerAddr, String currency) { this.customerName = customerName; this.customerAddr = customerAddr; this.currency = currency; } // 生成getter和setter方法 public String getCustomerName() { return customerName; } public void setCustomerName(String customerName) { this.customerName = customerName; } public String getCustomerAddr() { return customerAddr; } public void setCustomerAddr(String customerAddr) { this.customerAddr = customerAddr; } public String getCurrency() { return currency; } public void setCurrency(String currency) { this.currency = currency; } }
2. 修改反序列化工具类,支持按环境提取数据
先读取整个JSON结构,再根据选定环境提取对应节点,最后反序列化为P对象:
import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.io.InputStream; public class JacksonUtils { // 按环境反序列化的核心方法 public static P deserializeByEnv(String fileName, String env) throws IOException { InputStream is = JacksonUtils.class.getClassLoader().getResourceAsStream(fileName); ObjectMapper objectMapper = new ObjectMapper(); // 读取整个JSON为树形结构,便于按节点提取 JsonNode rootNode = objectMapper.readTree(is); // 统一环境名大小写,避免大小写敏感问题 JsonNode envNode = rootNode.get(env.trim().toUpperCase()); if (envNode == null) { throw new IllegalArgumentException("环境 " + env + " 在JSON文件中不存在"); } // 将环境对应的节点转换为P对象 return objectMapper.treeToValue(envNode, P.class); } // 保留原有通用反序列化方法(按需使用) public static <T> T deserializeJson(String fileName, Class<T> clazz) throws IOException { InputStream is = JacksonUtils.class.getClassLoader().getResourceAsStream(fileName); ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.readValue(is, clazz); } }
3. 测试脚本调用示例
根据用户选择的环境,直接调用工具方法获取对象:
public class TestScript { public static void main(String[] args) { try { // 模拟用户选择的环境(可从配置、命令行参数等渠道获取) String selectedEnv = "QA"; // 切换为"STAGE"即可获取对应环境数据 P customerData = JacksonUtils.deserializeByEnv("config.json", selectedEnv); // 使用反序列化后的对象执行测试逻辑 System.out.println("客户名称:" + customerData.getCustomerName()); System.out.println("客户地址:" + customerData.getCustomerAddr()); System.out.println("货币类型:" + customerData.getCurrency()); } catch (IOException e) { e.printStackTrace(); } } }
关键细节说明
- 大小写兼容:通过
toUpperCase()处理环境参数,确保qa、Qa等输入都能匹配JSON中的QA节点 - 异常前置:提前判断环境节点是否存在,避免后续逻辑出现空指针问题
- 逻辑解耦:将环境选择与实体类映射分离,减少代码耦合度
内容的提问来源于stack exchange,提问作者Mandy
相关产品推荐
相关产品推荐

