179

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

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

5 回答 5

337

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

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

jsonObjectMapper杰克逊在哪里ObjectMapper


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

MyClass newJsonNode = jsonObjectMapper.readValue(someJsonNode, MyClass.class);
于 2015-02-25T08:39:32.530 回答
8

这应该可以解决问题:

mapper.readValue(fileReader, MyClass.class);

我说应该是因为我将它与 a 一起使用String,而不是 aBufferedReader但它应该仍然有效。

这是我的代码:

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)

您还可以在实例化时定义自定义反序列化器ObjectMapperhttp ://wiki.fasterxml.com/JacksonHowToCustomDeserializers

编辑:我只是想起了别的东西。如果您的对象具有比具有更多的属性,POJO并且您只想忽略您想要设置的额外内容:

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

或者你会得到一个错误,它找不到要设置的属性。

于 2013-10-31T16:24:04.063 回答
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。语言类)


    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);
于 2015-01-06T02:18:08.510 回答
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);
于 2014-10-14T22:17:02.153 回答
1

这也是一种不同的方式,可用于对象数组

ObjectReader reader = mapper.readerFor(new TypeReference<List<SomeClass>>() {
});
assert someJsonNode.isArray()
List<SomeClass> list = reader.readValue(someJsonNode);
于 2022-01-27T04:24:37.270 回答