将JsonNode转换为POJO

2022-08-31 06:27:03

这可能看起来有点不寻常,但我正在寻找一种有效的方法来将a转换/映射为.JsonNodePOJO

我将模型的一些信息存储在 json 文件中,并且我必须支持模型的几个版本。

我所做的是将json文件加载到JsonNode的内存中,应用几个版本控制策略以使其与最新版本的模型相匹配。

    ObjectMapper mapper = new ObjectMapper();
    BufferedReader fileReader = new BufferedReader(new FileReader(projPath));

    JsonNode rootNode = mapper.readTree(fileReader);

    //Upgrade our file in memory
    applyVersioningStrategy(rootNode);

    ProjectModel project = mapJsonNodeToProject(rootNode);

除非有更快的方法来做到这一点,否则我最终可能会简单地手动将JsonNodes


答案 1

在 Jackson 2.4 中,您可以按如下方式进行转换:

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);

杰克逊在哪里.jsonObjectMapperObjectMapper


在较旧版本的杰克逊中,它将是

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);

答案 2

这应该可以解决问题:

mapper.readValue(fileReader, MyClass.class);

我说应该,因为我用的是 ,而不是 a,但它仍然应该工作。StringBufferedReader

这是我的代码:

String inputString = // I grab my string here
MySessionClass sessionObject;
try {
    ObjectMapper objectMapper = new ObjectMapper();
    sessionObject = objectMapper.readValue(inputString, MySessionClass.class);

以下是该调用的官方文档:http://jackson.codehaus.org/1.7.9/javadoc/org/codehaus/jackson/map/ObjectMapper.html#readValue(java.lang.String, java.lang.Class)

您还可以在实例化 : http://wiki.fasterxml.com/JacksonHowToCustomDeserializers 时定义自定义反序列化程序ObjectMapper

编辑:我刚刚想起了别的东西。如果你的对象具有比 has 更多的属性,并且您只想忽略附加项,则需要设置以下内容:POJO

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

或者,你将收到一个错误,它找不到要设置的属性。