2012-03-22 11 views
11

Otrzymuję ciąg JSON ze strony internetowej. Mam dane, które wygląda następująco (JSON tablicy)Jak sprawdzić, czy dany obiekt jest obiektem lub tablicą w łańcuchu JSON

myconf= {URL:[blah,blah]} 

ale niektórzy razy Dane te mogą być (obiekt JSON)

myconf= {URL:{try}} 

również może być pusty

myconf= {}  

chcę wykonywać różne operacje, gdy jego obiekt i inne, gdy jest to tablica. Do tej pory w moim kodzie próbowałem rozważyć tylko tablice, więc dostaję następujący wyjątek. Ale nie jestem w stanie sprawdzić obiektów ani tablic.

otrzymuję następujący wyjątek

org.json.JSONException: JSONObject["URL"] is not a JSONArray. 

Może ktoś sugerują, jak to może być ustalona. W tym miejscu wiem, że obiekty i tablice są instancjami obiektu JSON. Ale nie mogłem znaleźć funkcji, dzięki której mogę sprawdzić, czy dana instancja jest tablicą lub obiektem.

Próbowałem, używając tego, czy warunek, ale bez powodzenia

if (myconf.length() == 0 ||myconf.has("URL")!=true||myconf.getJSONArray("URL").length()==0) 

Odpowiedz

23

obiekty JSON i tablice są przypadki JSONObject i JSONArray, odpowiednio. Dodajmy do tego, że metoda JSONObject ma metodę get, która zwróci obiekt, dzięki czemu można sprawdzić typ siebie, nie martwiąc się o ClassCastExceptions, i gotowe.

if (!json.isNull("URL")) 
{ 
    // Note, not `getJSONArray` or any of that. 
    // This will give us whatever's at "URL", regardless of its type. 
    Object item = json.get("URL"); 

    // `instanceof` tells us whether the object can be cast to a specific type 
    if (item instanceof JSONArray) 
    { 
     // it's an array 
     JSONArray urlArray = (JSONArray) item; 
     // do all kinds of JSONArray'ish things with urlArray 
    } 
    else 
    { 
     // if you know it's either an array or an object, then it's an object 
     JSONObject urlObject = (JSONObject) item; 
     // do objecty stuff with urlObject 
    } 
} 
else 
{ 
    // URL is null/undefined 
    // oh noes 
} 
+0

Dzięki. Zmieniłem moje pytanie, może to będzie miało więcej sensu, o co się zastanawiam. Czy możesz podać przykład jeśli (item instanceof JSONArray). Co powinienem umieścić, jeśli warunek? – Judy

+0

To * jest * przykładem. Operator 'instanceof' powie ci, czy' item' jest 'JSONArray'. Chwileczkę, lemme to trochę. – cHao

+0

Dzięki Chao. Właściwie to zadziałało. Ale ciąg może być również pusty. Tak też dostaję błąd. if (! myconf.isNull ("URL") || (myconf.getJSONArray ("URL")! = null) || myconf.getJSONArray ("URL"). length()> 0) {Obiekt obiektu = myconf.get ("URL"); // inny kod} Otrzymuję wyjątek JSONObject ["URL"] nie znaleziono. – Judy

5

sporo sposobów.

Ten jest mniej zalecany, jeśli chodzi o problemy z zasobami systemowymi/nadużycie używania wyjątków Java do określenia tablicy lub obiektu.

try{ 
// codes to get JSON object 
} catch (JSONException e){ 
// codes to get JSON array 
} 

Albo

To jest zalecane.

if (json instanceof Array) { 
    // get JSON array 
} else { 
    // get JSON object 
} 
+0

Dzięki, wiem jak usunąć wyjątki. Obawiam się sprawdzić zawartość obiektu i sprawdzić, czy URL jest tablicą lub obiektem. – Judy

+0

Tak, jeśli uderzysz wyjątek próbując uzyskać obiekt, gdy jest to tablica JSON, to zapewnisz implementację, aby uzyskać tablicę w klauzuli catch. Jest to jeden sposób, ale nie jest zalecane. –

+0

Właściwie szukam funkcji, której można użyć w warunku sprawdzenia. – Judy

0

Korzystanie z odpowiedzi @Chao mogę rozwiązać mój problem. W inny sposób możemy to sprawdzić.

To moje odpowiedzi JSON

{ 
    "message": "Club Details.", 
    "data": { 
    "main": [ 
     { 
     "id": "47", 
     "name": "Pizza", 

     } 
    ], 

    "description": "description not found", 
    "open_timings": "timings not found", 
    "services": [ 
     { 
     "id": "1", 
     "name": "Free Parking", 
     "icon": "http:\/\/hoppyclub.com\/uploads\/services\/ic_free_parking.png" 
     } 
    ] 
    } 
} 

Teraz możesz sprawdzić jak to, co jest przedmiotem JSONObject lub JSONArray w odpowiedzi.

String response = "above is my reponse"; 

    if (response != null && constant.isJSONValid(response)) 
    { 
     JSONObject jsonObject = new JSONObject(response); 

     JSONObject dataJson = jsonObject.getJSONObject("data"); 

     Object description = dataJson.get("description"); 

     if (description instanceof String) 
     { 
      Log.e(TAG, "Description is JSONObject..........."); 
     } 
     else 
     { 
      Log.e(TAG, "Description is JSONArray..........."); 
     } 
    } 

ten służy do sprawdzenia, które otrzymały json jest ważne lub nie

public boolean isJSONValid(String test) { 
     try { 
      new JSONObject(test); 
     } catch (JSONException ex) { 
      // e.g. in case JSONArray is valid as well... 
      try { 
       new JSONArray(test); 
      } catch (JSONException ex1) { 
       return false; 
      } 
     } 
     return true; 
    } 
Powiązane problemy