2012-03-22 19 views
11

dizesiyle nasıl ilişkilendirilir Web sitesinden JSON dizesi alıyorum. BenVerilen nesnenin nesne mi, yoksa JSON dizesi

myconf= {}  

istediğim boş olabilir bu (JSON Array) benziyor verileri

myconf= {URL:[blah,blah]} 

ancak bu veriler (JSON nesnesi) ayrıca

myconf= {URL:{try}} 

olabilir bazı kere sahip nesnesi farklı olduğunda farklı işlemler yapmak ve bir dizi olduğunda farklı. Şimdi koduma kadar sadece dizileri dikkate almaya çalışıyordum, bu yüzden istisnasızı izliyorum. Ancak nesneleri veya dizileri kontrol edemiyorum.

Ben

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

kimse bunun nasıl tespit edilebilir önerebilir şu istisna alıyorum. Burada nesnelerin ve dizilerin JSON nesnesinin örnekleri olduğunu biliyorum. Ancak, verilen örneğin bir dizi mi yoksa nesne mi olduğunu kontrol edebileceğim bir işlev bulamadım.

Ben koşul ama eğer hiçbir başarı

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

cevap

23

JSON nesneleri ve diziler, sırasıyla JSONObject ve JSONArray, örnekleridir. Buna ek olarak JSONObject'un size bir nesne döndürecek bir get metoduna sahip olduğunu ve ClassCastExceptions hakkında endişelenmeden kendinizin tipini kontrol edebileceğiniz bir şey ekleyin.

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

Teşekkürler. Sorguyu düzenledim, merak ettiğim şey daha mantıklı olabilir. Örnek verirseniz (öğe instanceof JSONArray). Durumumda ne koymalıyım? – Judy

+0

Bu * bir örnektir. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Instanceof'' operatörü size söyleyecektir. Bekle, bana biraz et ver. – cHao

+0

Teşekkürler Chao. Aslında işe yaradı. Ama dize de boş olabilir. Ben de bunun için hata alıyorum. if (! myconf.isNull ("URL") || (myconf.getJSONArray ("URL")! = null) || myconf.getJSONArray ("URL"). length()> 0) {Nesne öğesi = myconf.get ("URL"); // diğer kod} Özel durum alıyorum JSONObject ["URL"] bulunamadı. – Judy

5

Oldukça birkaç yolu ile bu kullanarak çalıştılar. Bir dizi veya nesneyi belirlemek için sistem kaynaklarıyla ilgili sorunlardan/Java istisnalarının kötüye kullanılmasıyla ilgili endişeleriniz varsa, bu, daha az öneride bulunur. Üste |

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

Ya

Bu önerilir.

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

Teşekkür json geçerlidir almamasından kontrolü için kullanılır, ben istisnalar kaldırmak biliyorum. Nesnenin içeriğini kontrol etme ve URL'nin dizi mi yoksa bir nesne mi olduğunu kontrol etme konusunda endişeliyim. – Judy

+0

Evet, bir JSON dizisi olduğunda bir nesne almaya çalışırken bir istisna isabet ederseniz, yakalama deyiminde bir dizi almak için uygulamayı sağlayın. Bu tavsiye edilmemesinin bir yoludur. –

+0

Aslında, kontrol için koşul varsa kullanılabilecek bir işlev arıyorum. – Judy

0

@Chao yanıtını kullanarak sorunu çözebilirim. Diğer şekilde bunu da kontrol edebiliriz.

Bu

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

Şimdi nesne cevaben JSONObject veya JSONArray olan bu böyle kontrol edebilirsiniz benim Json yanıttır.

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

Bu

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