如何在特定键上启动Jackson JSON ObjectMapper?

时间:2014-04-25 16:16:42

标签: java json jackson

我有一个我想要映射的JSON数组,如下所示:

{
    "library": [
        {
          "key":"val"
        },
        {
          "key":"val"
        }
    ]
}

有没有办法使用对象映射器从数组开始而不是从根解析?我知道你可以做一个手动节点解析,但如果可能,我宁愿不这样做。任何有关这方面的帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

杰克逊提供了三种解析json的主要方法:地图,对象和杰克逊节点树。这些方法都没有提供从根以外的任何地方开始的方法。要从根以外的某个地方开始,您需要从根解析到那里,这意味着您需要从根开始解析! :)

话虽如此,如果您使用映射到对象,很容易从对象中获取所需的数组:

package test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class Test {

    static String json = "{\"library\": [{\"key\":\"val\"},{\"key\":\"val\"}]}";

    static class JsonClass {
        private ArrayList<Map<?,?>> library;

        public ArrayList<Map<?, ?>> getLibrary() {
            return library;
        }

        public void setLibrary(ArrayList<Map<?, ?>> library) {
            this.library = library;
        }
    }

    public static void main(String[] args) 
            throws JsonParseException, JsonMappingException, IOException {

        JsonClass parsed = new ObjectMapper().readValue(json, Test.JsonClass.class);
        System.out.println(parsed.getLibrary());

    }

}

运行此打印:

[{key=val}, {key=val}]

另一种方法是使用流解析器...它可以选择任何节点,而无需理解整个结构。我相信Gson有这个。但在你的情况下,使用流式解析器可能会有些过分:当整体结构很复杂时,你需要快速处理大流,并且对相对较小的数据部分感兴趣。这些似乎不适用于您的场景。