将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_UNKNOWN_PROPERTIES);
- jackson数据绑定枚举不区分大小写
- 将一个Map <String,String>转换为一个POJO
- 我应该如何在我的RESTful JAX-RS Web服务中logging未捕获的exception?
- 为什么当一个构造函数用@JsonCreator注解时,它的参数必须用@JsonProperty注解?
- jackson:如何添加自定义属性到JSON而不修改POJO
- JsonMappingException:找不到types为的合适构造函数:无法从JSON对象实例化
- @JsonProperty字段的注释以及getter / setter
- 如何将JSONArray转换为使用camel-jackson的对象列表
- Java 8 LocalDate Jackson格式