2013-03-18 219 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內容,除非映射一次完成。這與數據綁定遇到的問題相同;有時候解決方法是使用事件流代替。