将JsonNode转换为POJO

时间:2013-10-31 16:18:39

标签: java json jackson

这看起来有点不寻常,但我正在寻找一种有效的方法来将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应用于我的模型

4 个答案:

答案 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);

以下是该电话的官方文档: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);

或者您将收到无法找到要设置的属性的错误。

答案 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_UNK‌​NOWN_PROPERTIES);