根据所选环境获取反序列化的构造函数



我试图根据用户选择的环境对JSON文件进行反序列化。我的要求是根据所选环境从JSON中选择数据&将它们转换为Java对象以运行我的测试脚本。以下是到目前为止我能想到的研究。

JSON文件//根据环境(QA,STAGE)选择JSON数组

{
"QA":{
"customerName":"Customer QA",
"customerAddr":"UK",
"currency": "GBP"
},
"STAGE" : {
"customerName":"Customer STAGE",
"customerAddr":"FRANCE",
"currency": "EUR"
}
}

Java类//类将JSON转换为对象。调用环境(QA,STAGE)

类基的构造函数
public class P {
String customerName;
String customerAddr;
String currency;

P(String env,String customerName,String customerAddr,String currency)  
{
if(env.equals("qa"){}
if(env.equals("stage"){}
}

<<p>反序列化类/strong>//需要根据反序列化 的环境决定如何调用上面的类构造函数
public static <T> T deserializeJson(String fileName, Class<T> T) throws IOException {
InputStream is = JacksonUtils.class.getClassLoader().getResourceAsStream(fileName);
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(is, T);
}```

似乎有多种可能的解决方案。然而,如果不知道之后你想用它做什么,就不可能知道哪个是最好的。

我个人会创建一个额外的类来保存环境,因为应该有有限数量的环境(目前我们知道大约有2个)。

@Data
class Environment {
@JsonProperty(value = "QA")
UserData qa;
@JsonProperty(value = "STAGE")
UserData stage;
}

UserData是你的P:

@Data
class UserData {
String customerName;
String customerAddr;
String currency;
}

那么你可以这样解析它:

String json = "{n" + ""QA":{n" + "  "customerName":"Customer QA",n"
+ "  "customerAddr":"UK",n" + "  "currency": "GBP"n" + " },n"
+ ""STAGE" : {n" + "   "customerName":"Customer STAGE",n"
+ "   "customerAddr":"FRANCE",n" + "   "currency": "EUR"n" + "}n"
+ "}";
ObjectMapper objectMapper = new ObjectMapper();
Environment environment = objectMapper.readValue(json, Environment.class);
System.out.println(environment);

打印:

Environment(qa=UserData(customerName=Customer QA, customerAddr=UK, currency=GBP), stage=UserData(customerName=Customer STAGE, customerAddr=FRANCE, currency=EUR))

并允许您通过调用environment.getQa();environment.getStage();访问UserData


另一种可能的解决方案是利用objectMapper.readValue()方法提供的TypeReference。这里我们将JSON解析为Map<String, UserData>,跳过Environment类,这使得它更动态,允许您通过JSON添加新环境:

String json = "{n" + ""QA":{n" + "  "customerName":"Customer QA",n"
+ "  "customerAddr":"UK",n" + "  "currency": "GBP"n" + " },n"
+ ""STAGE" : {n" + "   "customerName":"Customer STAGE",n"
+ "   "customerAddr":"FRANCE",n" + "   "currency": "EUR"n" + "}n"
+ "}";
TypeReference<Map<String, UserData>> type = new TypeReference<Map<String, UserData>>() {
};
ObjectMapper objectMapper = new ObjectMapper();
Map<String, UserData> readValue = objectMapper.readValue(json, type);
System.out.println(readValue.get("STAGE"));

这个打印:

UserData(customerName=Customer STAGE, customerAddr=FRANCE, currency=EUR)

最新更新