JavaJackson反序列化特殊列表

c9x0cxw0  于 2023-06-28  发布在  Java
关注(0)|答案(1)|浏览(108)

我试图解决反序列化问题,但现在我想请任何人帮助我。
我有一个典型的Yaml列表:

service:  
  env:
    - name: WAN_PORT
      value: "80"
    - name: LAN_PORT
      value: "8080"
    - name: SITE_URL
      value: "http://google.com"

我需要以下对象的这些信息:

public class Env {
    private String name;
    private String value;
}

到目前为止,我创建了一个简单的ObjectMapper,并使用该对象的'readValue'成员来处理JsonNode。

ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
jsonNode = jsonNode.get("service").get("env");
TypeReference<Map<String,Env>> typeRef = new TypeReference<>() {};
Map<String,Env> envMap = yamlFileMapper.getObjectMapper().readValue(jsonNode.toString(), typeRef);

我过去和Jackson一起工作过,它简单地和简单的对象或列表一起工作。现在我收集所有env-pair到object并存储到Collection中,如:

List<Env> listOfEnv = ....

谢谢!

2ul0zpep

2ul0zpep1#

正如jackson-databind github项目页面所建议的,不需要创建一个新的TypeReference来处理列表,你可以直接在treeToValue方法中使用List

ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
JsonNode env = mapper.readTree(yaml).at("/service/env");
List<Env> list = mapper.treeToValue(env, List.class);
//ok, it prints [{name=WAN_PORT, value=80}, {name=LAN_PORT, value=8080}, {name=SITE_URL, value=http://google.com}]
System.out.println(list);

相关问题