2014-07-19 18 views
5

Ho deciso di utilizzare JSON.Semplice per analizzare Java nella mia applicazione, come indicato da GSON o Jackson, perché entrambi sembrano troppo complicati per le mie esigenze e sembravano aver bisogno di ulteriori file di classe per funzionare come previsto. Ho il seguente JSON:Utilizzo di JSON.Simple con oggetti e array nidificati

{ 
    "request":{ 
     "act":"rec_load_all", 
     "email":"Redacted", 
     "tkn":"Redacted", 
     "a":"rec_load_all", 
     "z":"Redacted" 
    }, 
    "response":{ 
     "recs":{ 
      "has_more":false, 
      "count":9, 
      "objs":[{ 
       "rec_id":"1385442465", 
       "rec_hash":"1825780e334bcd831034bd9ca62", 
       "zone_name":"Redacted", 
       "name":"Redacted", 
       "display_name":"Redacted", 
       "type":"A", 
       "prio":null, 
       "content":"Redacted", 
       "display_content":"Redacted", 
       "ttl":"1", 
       "ttl_ceil":86400, 
       "ssl_id":null, 
       "ssl_status":null, 
       "ssl_expires_on":null, 
       "auto_ttl":1, 
       "service_mode":"1", 
       "props":{ 
        "proxiable":1, 
        "cloud_on":1, 
        "cf_open":0, 
        "ssl":0, 
        "expired_ssl":0, 
        "expiring_ssl":0, 
        "pending_ssl":0, 
        "vanity_lock":0 
       } 
      }] 
     } 
    }, 
    "result":"success", 
    "msg":null 
} 

I objs matrice liste 9 articoli diversi, ma ho incluso un solo per semplicità. Devo ottenere has_more, count e id entro objs. Ho provato:

JSONParser jsonParser = new JSONParser(); 
JSONObject jsonObject = (JSONObject) jsonParser.parse(responseString); 
JSONArray objs = (JSONArray) jsonObject.get("objs"); 
Iterator<JSONObject> iterator = objs.iterator(); 
while (iterator.hasNext()) { 
    JSONObject idObj = (JSONObject) iterator.next(); 
    String id = (String) idObj.get("rec_id"); 
    System.out.println(id); 
} 

Ma spara un errore di java.lang.NullPointerException, quindi sto assumendo perché è annidato sotto response -> recs -> objs non è sempre un valore. Sto anche seguendo un tutorial di qualche anno, quindi qualcosa potrebbe essere cambiato da allora. Se tu potessi spiegare cosa è sbagliato e un esempio di come risolverlo, lo apprezzerei molto, imparo vedendo.

EDIT: errore completa

Exception in thread "main" java.lang.NullPointerException 
    at ddns.Net.getId(Net.java:46) 
    at ddns.DDNS.main(DDNS.java:7) 
Java Result: 1 

ddns.Net.getId (Net.java:46) | Iterator<JSONObject> iterator = objs.iterator(); ddns.DDNS.main (DDNS.java:7) | Just calls the method

+0

puoi fornire lo stacktrace? –

+0

@ GaneshChithambalamA.S. Aggiunto all'OP. – Novicode

+0

Se sta lanciando un NPE, significa che l'oggetto 'idObj' potrebbe essere nullo. Sarebbe strano per 'get' gettare NPE. Potrebbe restituire null, ma non mi aspetterei che possa generare NPE. – Brian

risposta

5

Bisogna prendere qualsiasi oggetto JSON da genitore e così via, date un'occhiata questo codice (ho provato e opere):

public static void main(String[] args) throws IOException, ParseException { 

    JSONParser jsonParser = new JSONParser(); 

    InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("json.json"); 
    InputStreamReader reader = new InputStreamReader(is); 
    JSONObject result = (JSONObject) jsonParser.parse(reader); 
    JSONObject response = (JSONObject) result.get("response"); 
    JSONObject recs = (JSONObject) response.get("recs"); 

    boolean hasMore = (Boolean) recs.get("has_more"); 
    JSONArray objs = (JSONArray) recs.get("objs"); 
    System.out.println(recs); 
    System.out.println("has more " + hasMore); 

    Iterator objIter = objs.iterator(); 
    int i = 0; 
    while (objIter.hasNext()) { 
     i++; 
     System.out.println(String.format("obj %d: %s", i, objIter.next())); 
    } 

} 

c'è un altro modo che per me è più facile e più è quello di creare un Java Bean con la stessa struttura quindi ... analizzerete un oggetto buco, se siete interessati a questo approccio fatemelo sapere.

+0

Ai fini dell'apprendimento, se si desidera fornire entrambi gli approcci sarebbe fantastico. – Novicode

+0

Lasciami 5 minuti e mostrerò un piccolo esempio. –

+0

Sto riscontrando un problema con il tuo codice. 'Eccezione nella discussione" main "java.lang.NullPointerException \t su java.io.Reader. (Reader.java:78) \t in java.io.InputStreamReader. (InputStreamReader.java:72) \t a ddns.Net.getId (Net.java:46) \t a ddns.DDNS.main (DDNS.java:7) Java Risultato: 1' – Novicode

Problemi correlati