将JsonNode转换为POJO

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

我将一些模型的信息存储在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); 

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

在jackson2.4,你可以转换如下:

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

jsonObjectMapper是一个Jackson ObjectMapper


在旧版本的jackson,这将是

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

这应该做的伎俩:

 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 : ObjectMapper

编辑:我只记得别的东西。 如果你的对象有更多的属性比POJO ,你只是想忽略额外的,你会想要设置:

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

或者你会得到一个错误,它无法find要设置的属性。

如果你使用的是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); 
 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); 

如果你的JSONinput有比POJO更多的属性,而你只想忽略Jackson 2.4中的额外属性,你可以按如下方式configuration你的ObjectMapper。 这个语法不同于旧的jackson版本。 (如果使用错误的语法,它将默默无闻。)

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