首页 文章

将JsonNode转换为POJO

提问于
浏览
105

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

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

4 回答

  • 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 . This syntax is different from older Jackson versions. (如果使用错误的语法,它将默默地执行任何操作 . )

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

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

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

    其中 jsonObjectMapper 是 Jackson ObjectMapper .


    在 Jackson 的旧版本中,它会是

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

    这应该做的伎俩:

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

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

  • 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](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);
    

相关问题