2013-03-18 172 views
4

我想递归地解析包含许多复杂元素集的示例Json文件。 而我想要的代码是这样的:使用Jackson Json解析器递归解析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)):期待双引号开始字段名称 at [Source:[email protected];行:1,列:3]

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

+0

你能展示一些JSON吗?为什么它是无效的?至少对于字段名称,您可以配置[JsonParser.Feature ALLOW_UNQUOTED_FIELD_NAMES](http://fasterxml.github.com/jackson-core/javadoc/2.1.0/com/fasterxml/jackson/core/JsonParser.Feature.html#ALLOW_UNQUOTED_FIELD_NAMES )在ObjectMapper上。 – nutlike 2013-03-18 15:25:58

+0

{ “菜单”:{ “ID”: “文件”, “值”: “文件”, “弹出”:{ “菜单项”: { “值”: “新”, “点击” :“CreateNewDoc()”} {“value”:“Open”,“onclick”:“OpenDoc()”}, {“value”:“Close”,“onclick”:“CloseDoc()”} ] }} }} 感谢这么多,但工作,但有一个新的异常。它说 异常org.codehaus.jackson.JsonParseException:意外的字符('='(代码61)):期待一个冒号单独的字段名称和值 at [Source:[email protected];行:1,列:5] 现在。请帮助我@nutlike – sreeraag 2013-03-18 16:57:26

+0

当我要求JSON时,我的意思是**您的** JSON而不是http://json.org/example.html ...请相应地更新您的问题。除此之外(再次):为什么你的JSON无效?你从哪里得到它? – nutlike 2013-03-18 17:20:58

回答

5

,而不是分析自己的一切,你应该考虑使用杰克逊内置树模型特征(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。

+0

对不起,我仍然努力找出如何迭代一次我有根节点的方法。我对json完全陌生。我有的基本问题是我不知道元素名称apriori @nutlike – sreeraag 2013-03-18 19:12:03

+0

@sreeraag:我更新了我的例子。我想你应该能够找出遗漏的部分,如果你研究我的答案中链接的API。 – nutlike 2013-03-18 19:23:13

+0

它只能在层次结构的一个层次上完成工作,不适用于多个层次,例如,在上面的示例中,popup完全是作为一个实体给出的,但是是一个复杂的元素本身 – sreeraag 2013-03-18 19:35:49

4

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