使用Jackson Json解析器递归解析json文件

时间:2013-03-18 15:15:09

标签: json jackson

我正在尝试以递归方式解析具有许多复杂元素集的示例Json文件。 我正在尝试的代码是:

public class Jsonex {
    public static void main(String argv[]) {
        try {
            Jsonex jsonExample = new Jsonex();
           jsonExample.testJackson();
        } catch (Exception e){
            System.out.println("Exception " + e);
        }       
    }
    public static void testJackson() throws IOException {       
        JsonFactory factory = new JsonFactory();
       // System.out.println("hello");
        ObjectMapper mapper = new ObjectMapper(factory);
        File from = new File("D://albumList.txt");
        TypeReference<HashMap<String,Object>> typeRef = new TypeReference<HashMap<String,Object>>() {};
        HashMap<String,Object> o= mapper.readValue(from, typeRef);
       // System.out.println("" + o);
        Iterator it = o.entrySet().iterator();
       while (it.hasNext()) {

          Map.Entry pairs = (Map.Entry)it.next();
            System.out.println(pairs.getKey() + " = " + pairs.getValue());

           HashMap<String,Object> o1=mapper.readValue(pairs.getValue().toString(),typeRef);
          System.out.println("hey"+o1);
           Iterator it1 = o1.entrySet().iterator();
           while (it1.hasNext()) {
                Map.Entry pairs1 = (Map.Entry)it.next();
                System.out.println(pairs1.getKey() + " = " + pairs1.getValue());
            it1.remove(); // avoids a ConcurrentModificat



    }   
    }
}}

我得到了这个例外:

异常org.codehaus.jackson.JsonParseException:意外字符('i'(代码105)):期望双引号启动字段名称  在[来源:java.io.StringReader@2de7753a; line:1,column:3]

实际上我想要做的是,解析文件并获取名称对象对列表,并获取inturn具有名称 - 对象对的对象。 - 但问题是解析器在字符串之前期待“”!

2 个答案:

答案 0 :(得分:5)

不应自行解析所有内容,而应考虑使用Jacksons内置树模型功能(http://wiki.fasterxml.com/JacksonTreeModel):

ObjectMapper mapper = new ObjectMapper(factory);
File from = new File("D://albumList.txt");
JsonNode rootNode = mapper.readTree(from);  

Iterator<Map.Entry<String,JsonNode>> fields = rootNode.fields();
while (fields.hasNext()) {

    Map.Entry<String,JsonNode> field = fields.next();
    System.out.println(field.getKey() + " = " + field.getValue());
    …

}

从长远来看,这应该更方便。请查看http://fasterxml.github.com/jackson-databind/javadoc/2.1.0/com/fasterxml/jackson/databind/JsonNode.html处的API。

答案 1 :(得分:4)

只是评论。如您所知,Jackson支持3种主要处理模式(数据绑定,流API和树模型)。您需要考虑到,如果您决定使用树模型,根据官方文档,内存使用量与映射的内容成比例(类似于数据绑定),因此树模型不能与巨大的Json内容一起使用,除非映射一次完成。这与数据绑定遇到的问题相同;有时解决方案是使用事件流来代替。

相关问题