这似乎有点不寻常,但我正在寻找一种将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);
除非有更快的方法,否则我最终可能只是手动地将jsonnode应用到我的模型
在Jackson 2.4中,您可以按以下方式进行转换:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
其中jsonObjectMapper是Jackson ObjectMapper。
在杰克逊的老版本中,答案是肯定的
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
这应该可以达到目的:
mapper.readValue(fileReader, MyClass.class);
我说should是因为我用的是字符串,而不是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(java.lang.String, java.lang.Class)
你也可以在实例化ObjectMapper时定义一个自定义反序列化器:
http://wiki.fasterxml.com/JacksonHowToCustomDeserializers
编辑:
我刚想起一件事。如果你的对象比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_UNKNOWN_PROPERTIES);
在Jackson 2.4中,您可以按以下方式进行转换:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
其中jsonObjectMapper是Jackson ObjectMapper。
在杰克逊的老版本中,答案是肯定的
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);