2014-07-19 27 views
5

Postanowiłem użyć JSON.Simple do analizy Java w mojej aplikacji, jak w przypadku aplikacji GSON lub Jackson, ponieważ obie wydają się zbyt skomplikowane dla moich potrzeb i wydawało się, że potrzebują dodatkowej pliki klas do działania zgodnie z przeznaczeniem. Mam następujący JSON:Używanie JSON.Simple z zagnieżdżonymi obiektami i tablicami

{ 
    "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 
} 

The objs list tablicy 9 różnych przedmiotów, ale tylko włączone jeden dla prostoty. Muszę uzyskać has_more, count i id z zakresu objs. Próbowałem:

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

Ale pożary błąd java.lang.NullPointerException, więc jestem zakładając, ponieważ jest zagnieżdżone pod response -> recs -> objs nie jest uzyskanie wartości. Podążam też za kilkuletnim tutorialem, więc od tego czasu mogło się coś zmienić. Jeśli mógłbyś wyjaśnić, co jest nie tak i jak to naprawić, byłbym bardzo wdzięczny, uczę się, widząc.

EDIT: Pełny błąd

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

czy możesz podać stacktrace? –

+0

@ GaneshChithambalamA.S. Dodano go do OP. – Novicode

+0

Jeśli wyrzuca NPE, oznacza to, że obiekt 'idObj' może być pusty. Byłoby dziwne, gdyby 'get' rzucił NPE. Może zwrócić wartość null, ale nie spodziewam się, że wyrzuci NPE. – Brian

Odpowiedz

5

Trzeba wziąć dowolny obiekt json od rodziców i tak dalej, spójrz ten kod (próbowałem i działa):

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

} 

Jest też inny sposób, który jest dla mnie łatwiejsze i jest stworzenie Java Bean o tej samej strukturze, więc ... sparsujesz obiekt typu hole, jeśli jesteś zainteresowany tym podejściem daj mi znać.

+0

Dla celów edukacyjnych, jeśli chcesz zapewnić oba podejścia, które byłyby wspaniałe. – Novicode

+0

Pozwól mi 5 minut, a pokażę mały przykład. –

+0

Mam problem z Twoim kodem. 'Wyjątek w wątku" główny "java.lang.NullPointerException \t w java.io.Reader. (Reader.java:78) \t w java.io.InputStreamReader. (InputStreamReader.java:72) \t na ddns.Net.getId (Net.java:46) \t na ddns.DDNS.main (DDNS.java:7) Java Result: 1 ' – Novicode

Powiązane problemy