2012-12-17 17 views
5

我试图简化我的代码:我想存储键和值(所有字符串)。杰克逊 - 递归解析为Map <String,Object>

我实际上使用Map<String, Object>来存储它。帽子路Object可能是一个值(String)或新节点(Map<String, Object>)。

我怎样才能简化这段代码? 递归函数会很好。

try { 
    JsonParser jsonParser = new JsonFactory().createJsonParser(content); 

    jsonParser.nextToken(); 
    while (jsonParser.nextToken() != JsonToken.END_OBJECT) { 
     jsonParser.nextToken(); 

     if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) { 
      while (jsonParser.nextToken() != JsonToken.END_OBJECT) { 
       String key = jsonParser.getCurrentName(); 
       jsonParser.nextToken(); 

       if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) { 
        mData.put(key, new HashMap<String, Object>()); 
        while (jsonParser.nextToken() != JsonToken.END_OBJECT) { 
         String subkey = jsonParser.getCurrentName(); 
         jsonParser.nextToken(); 

         if (jsonParser.getCurrentToken() == JsonToken.START_OBJECT) { 
          Map<String, Object> subdata = (Map<String, Object>) mData.get(key); 
          subdata.put(subkey, new HashMap<String, Object>()); 
          while (jsonParser.nextToken() != JsonToken.END_OBJECT) { 
           String subsubkey = jsonParser.getCurrentName(); 
           jsonParser.nextToken(); 
           Map<String, Object> subsubdata = (Map<String, Object>) subdata.get(subkey); 
           LogHelper.d("data[" + key + "][" + subkey + "][" + subsubkey + "]=" + jsonParser.getText()); 
           subsubdata.put(subsubkey, jsonParser.getText()); 
          } 
         } 
         else { 
          LogHelper.d("data[" + key + "]=" + jsonParser.getText()); 
          mData.put(key, jsonParser.getText()); 
         } 
        } 
       } 
       else { 
        LogHelper.d("data[" + key + "]=" + jsonParser.getText()); 
        mData.put(key, jsonParser.getText()); 
       } 
      } 
     } 
     else { 
      LogHelper.d("status=" + jsonParser.getText()); 
      mStatus = jsonParser.getText(); 
     } 
    } 
} 
catch (IllegalArgumentException e) { 
    error("0", "IllegalArgumentException: " + e.getMessage()); 
} 
catch (JsonParseException e) { 
    error("0", "IOException: " + e.getMessage()); 
} 
catch (IOException e) { 
    error("0", "IOException: " + e.getMessage()); 
} 

回答

20

假设你的最终目标就是反序列化JSON成Map<String, Object>,有一个简单得多的与杰克逊做到这一点的方式。使用ObjectMapper

final String json = "{}"; 
final ObjectMapper mapper = new ObjectMapper(); 
final MapType type = mapper.getTypeFactory().constructMapType(
    Map.class, String.class, Object.class); 
final Map<String, Object> data = mapper.readValue(json, type); 

你需要错误处理等,但是这是一个很好的起点。

+0

事实上,使用'jackson-core'和'jackson-mapper'库使你的代码只用3行!谢谢! – shkschneider