将JsonNode转换为POJO

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

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

我所做的是在JsonNode的内存中加载json文件,应用一些版本控制策略,使其与我的模型的最新版本匹配。

    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应用到我的模型

187824 次浏览

这应该可以达到目的:

mapper.readValue(fileReader, MyClass.class);

我说should是因为我使用的是String,而不是BufferedReader,但它仍然可以工作。

这是我的代码:

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(以. lang . class)

你也可以在实例化ObjectMapper时定义一个自定义反序列化器: http://wiki.fasterxml.com/JacksonHowToCustomDeserializers < / p > < p >编辑: 我刚想起一件事。如果传入的对象具有比POJO更多的属性,并且你只想忽略额外的属性,你将需要设置这个:

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

否则,您将得到一个错误,它无法找到要设置的属性。

String jsonInput = "{ \"hi\": \"Assume this is the JSON\"} ";
com.fasterxml.jackson.databind.ObjectMapper mapper =
new com.fasterxml.jackson.databind.ObjectMapper();
MyClass myObject = objectMapper.readValue(jsonInput, MyClass.class);

如果您的JSON输入比POJO拥有更多的属性,并且您只想忽略Jackson 2.4中的额外属性,那么您可以按照以下方式配置ObjectMapper。此语法与老的Jackson版本不同。(如果你使用错误的语法,它将默默不做任何事情。)

mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNK‌​NOWN_PROPERTIES);

如果你使用org。codehaus。杰克逊,从1.6年开始就可以了。你可以用ObjectMapper#readValue将JsonNode转换为POJO: http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/ObjectMapper.html readValue (org.codehaus.jackson.JsonNode, java.lang.Class)


ObjectMapper mapper = new ObjectMapper();
JsonParser jsonParser = mapper.getJsonFactory().createJsonParser("{\"foo\":\"bar\"}");
JsonNode tree = jsonParser.readValueAsTree();
// Do stuff to the tree
mapper.readValue(tree, Foo.class);

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

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

其中jsonObjectMapper是Jackson ObjectMapper


在杰克逊的老版本中,答案是肯定的

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

这也是一种不同的方式,可用于对象数组

ObjectReader reader = mapper.readerFor(new TypeReference<List<SomeClass>>() {
});
assert someJsonNode.isArray()
List<SomeClass> list = reader.readValue(someJsonNode);