You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于所选环境实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 23:35:23