2011-05-02 67 views
0

我有一個包含多個JSON對象的文件,每個JSON對象都可能包含其他對象和數組。使用Jackson閱讀單個JSON事件

我想將其反序列化,最好使用Jackson庫,將其反序列化爲維護頂級對象分離的數據結構,例如, Java HashMap<String, String>對象的數組或列表,其中每個HashMap將包含文件中單個頂級JSON對象的數據。

從我所看到的,你不能從傑克遜HashMap<String, String>,所以我必須忍受一個HashMap<String, Object>

List<HashMap<String,Object>> values = new ObjectMapper().readValue(new BufferedReader(new FileReader(path)), new TypeReference<List<HashMap<String, Object>>>() {}); 

上述作品中的反序列化預期,但是我得到的所有文件數據和一個不是單一的JSON對象的數據,如我所願。

任何想法?

謝謝!

+0

什麼是一個簡單的JSON示例,它與您嘗試使用的內容相匹配? – 2011-07-11 21:16:19

回答

0

相當多的努力後,這裏是一個簡單的辦法,似乎工作:

Reader inputReader = new BufferedReader(new FileReader(filename)); 

int readEvents = 0; 

JsonFactory factory = new JsonFactory(); 

JsonParser parser = factory.createJsonParser(inputReader); 

JsonToken token = null; 
ObjectMapper mapper = new ObjectMapper(); 
HashMap<String,Object> attributes = null; 
ArrayList<Map<String,Object>> matchedEvents = new ArrayList<Map<String,Object>>(); 

try 
{ 
    while ((token=parser.nextToken()) != null) 
    { 
     if (token == JsonToken.START_OBJECT) 
     { 
      readEvents++; 
      attributes = mapper.readValue(parser, 
        new TypeReference<HashMap<String, Object>>() {}); 
      if (attributes != null) 
      { 
       matchedEvents.add(attributes); 
      } 
     } 
    } 
} 
catch (Exception e) 
{ 
    e.printStackTrace(); 
} 

System.out.println("Read " + readEvents + " events"); 

每一個放置在上面ArrayListHashMap<String, Object>對象對應一個(頂層)JSON事件。

readValue()方法顯然不返回Map(String, String)對象。

+0

「readValue()方法顯然不返回Map(String,String)對象。」 - 如果輸入JSON和指定爲readValue的目標類型都提供該結構,則readValue方法將確實返回Map 實例。我猜你的JSON結構不是字符串/字符串的映射,而是字符串/對象的映射,而你試圖說服傑克遜,它是一個字符串/字符串的映射,但事實並非如此。 – 2011-07-11 21:21:48