这看起来有点不寻常,但我正在寻找一种有效的方法来将JsonNode
转换/映射到POJO
。
我将一些Model的信息存储在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
应用于我的模型
答案 0 :(得分:213)
在Jackson 2.4中,您可以转换如下:
MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
其中jsonObjectMapper
是杰克逊ObjectMapper
。
在杰克逊的旧版本中,它将是
MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
答案 1 :(得分:8)
这应该可以解决问题:
mapper.readValue(fileReader, MyClass.class);
我说应该因为我使用的是String
,而不是BufferedReader
,但它应该仍然可以使用。
这是我的代码:
String inputString = // I grab my string here
MySessionClass sessionObject;
try {
ObjectMapper objectMapper = new ObjectMapper();
sessionObject = objectMapper.readValue(inputString, MySessionClass.class);
您还可以在实例化ObjectMapper
时定义自定义反序列化程序:
http://wiki.fasterxml.com/JacksonHowToCustomDeserializers
编辑:
我只想起别的东西。如果你的对象有更多的属性而不是POJO
,你只想忽略你想要设置的额外内容:
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
或者您将收到无法找到要设置的属性的错误。
答案 2 :(得分:4)
如果您正在使用org.codehaus.jackson,那么从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);
答案 3 :(得分:3)
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);