将JsonNode转换为POJO

Ale*_*dre 133 java json jackson

这似乎有点不寻常,但我正在寻找一种有效的方法来转换/映射JsonNode到一个POJO.

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

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

    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);
Run Code Online (Sandbox Code Playgroud)

除非有更快的方法,否则我可能最终只需手动应用JsonNodes到我的模型

ice*_*ees 239

在Jackson 2.4中,您可以转换如下:

MyClass newJsonNode = jsonObjectMapper.treeToValue(someJsonNode, MyClass.class);
Run Code Online (Sandbox Code Playgroud)

这里jsonObjectMapper是杰克逊ObjectMapper.


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

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,没有treeToValue(TreeNode n,TypeReference <T>类型)变体,就像readValue()一样.任何与泛型处理更复杂类型的人的坏消息:( (18认同)
  • @Espinosa Per [jackson-databind#1294](https://github.com/FasterXML/jackson-databind/issues/1294),你会想要像(不幸的是更详细)`jsonObjectMapper.readValue(jsonObjectMapper.treeAsTokens( someJsonNode),someTypeReference)` (11认同)
  • 您也可以在 StdDeserializer 中使用此方法:`p.codec.treeToValue`。 (3认同)
  • 对于旧版本使用:`objectMapper.treeToValue(jsonNode, MyClass.class)` (2认同)

Eri*_*arr 8

这应该做的伎俩:

mapper.readValue(fileReader, MyClass.class);
Run Code Online (Sandbox Code Playgroud)

我说应该因为我使用的是a String,而不是a,BufferedReader但它应该仍然有用.

这是我的代码:

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

以下是该调用的官方文档: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

编辑:我只想起别的东西.如果您的对象具有的属性多于POJOhas,并且您只想忽略额外内容,则需要设置此属性:

    objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Run Code Online (Sandbox Code Playgroud)

或者你会收到一个错误,它无法找到要设置的属性.

  • 语法现在是: com.fasterxml.jackson.databind.ObjectMapper mapper = new com.fasterxml.jackson.databind.ObjectMapper(); mapper.disable(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); (4认同)

小智 5

如果您使用的是org.codehaus.jackson,则从1.6开始就可以实现。您可以使用以下代码将JsonNode转换为POJO ObjectMapper#readValuehttp : //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);
Run Code Online (Sandbox Code Playgroud)

  • 2.4.4中似乎缺少此方法 (5认同)