2012-12-17 16 views
5

Próbuję uprościć mój kod: Chcę przechowywać klucz i wartości (wszystkie ciągi).Jackson - analiza rekurencyjna na mapie <String, Object>

Używam pliku Map<String, Object> do zapisania. hat way Object może być wartością (String) lub nowym węzłem (Map<String, Object>).

Jak mogę uprościć ten kod? Funkcja rekurencyjna byłaby dobra.

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()); 
} 

Odpowiedz

20

Zakładając, że końcowy cel jest tylko deserializować JSON do Map<String, Object>, jest znacznie prostszy sposób to zrobić z Jacksonem. Korzystanie 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); 

Musisz magazynowe itp błąd, ale jest to dobry punkt wyjścia.

+0

Rzeczywiście, używając bibliotek 'jackson-core' i' jackson-mapper' twój kod działa tylko z 3 liniami! Dzięki! – shkschneider

Powiązane problemy