我试图根据用户选择的环境对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)