2012-12-17 16 views
5

Sto cercando di semplificare il mio codice: voglio memorizzare chiave e valori (tutte le stringhe).Jackson - Analisi ricorsiva in Map <String, Object>

Attualmente sto utilizzando uno Map<String, Object> per memorizzarlo. hat way Object potrebbe essere un valore (String) o un nuovo nodo (Map<String, Object>).

Come posso semplificare questo codice? Una funzione ricorsiva sarebbe buona.

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

risposta

20

Supponendo che il vostro obiettivo finale è solo di deserializzare JSON in un Map<String, Object>, c'è un modo molto più semplice per fare questo con Jackson. Utilizza 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); 

Avrete bisogno di movimentazione, ecc errori, ma questo è un buon punto di partenza.

+0

Infatti, l'utilizzo delle librerie 'jackson-core' e' jackson-mapper' ha reso il codice funzionante con solo 3 righe! Grazie! – shkschneider

Problemi correlati