2012-03-22 13 views
11

ウェブサイトからJSON文字列を取得しています。私はこのデータをすることができ、このようになりますデータ(JSON配列)JSON文字列内で指定されたオブジェクトがオブジェクトか配列かをチェックする方法

myconf= {URL:[blah,blah]} 

が、いくつかの回(JSONオブジェクト)

myconf= {URL:{try}} 

を持っても、それは私が欲しい

myconf= {}  

空にすることができますそのオブジェクトが異なるときには異なる操作を行い、配列が異なる場合は異なる。今まで私のコードでは、配列だけを検討しようとしていたので、例外を受けています。しかし、私はオブジェクトや配列をチェックすることができません。

、誰もがそれを固定することができる方法を提案することができます私は、次の例外に

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

を取得しています。ここでは、オブジェクトと配列がJSONオブジェクトのインスタンスであることを知っています。しかし、私は、指定されたインスタンスが配列かオブジェクトかをチェックできる関数を見つけることができませんでした。

私は条件場合はありません成功

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

答えて

23

JSONオブジェクトと配列はそれぞれ、JSONObjectJSONArrayのインスタンスです。それに加えてJSONObjectにはgetメソッドがあり、オブジェクトを返すメソッドを追加すると、ClassCastExceptionsを気にせずに自分のタイプを確認できます。

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

ありがとうございます。私は私の疑問を編集したことが、私が不思議に思っていることがより理解できるようになるかもしれない。 if(item instanceof JSONArray)の例を挙げることができますか?状態の場合はどうしたらいいですか? – Judy

+0

これは例です。 'instanceof'演算子は' item'が 'JSONArray'かどうかを伝えます。ホールドして、少し肉付けしてください。 – cHao

+0

ありがとうチャオ。それは実際に働いた。しかし、文字列も空にすることができます。だから、私もそれに間違いがあります。 myconf.getJSONArray( "URL")。length()> 0){Object item = myconf.get(myconf.getJSONArray( "URL")!= null) ( "URL"); // other code} JSONObject ["URL"]が見つかりません。 – Judy

5

かなりの数の方法でこれを使用して試してみました。

システムリソースの問題/ Java例外を使用して配列やオブジェクトを判断することに悪用される場合は、この方法はお勧めしません。

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

それとも

これが推奨されます。

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

おかげで、私は例外を削除する方法を知っています。私は、オブジェクトの内容をチェックし、URLが配列かオブジェクトかをチェックすることに懸念しています。 – Judy

+0

JSON配列のときにオブジェクトを取得しようとしたときに例外が発生した場合、catch句に配列を取得する実装を提供します。これは推奨されていませんが、一方の方法です。 –

+0

実際には、チェックのためにif条件で使用できる関数を探しています。 – Judy

0

私の問題を解決できるのは、@Chaoの回答です。他の方法でもこれを確認することができます。

これは、今、あなたはこのように反応してJSONObjectまたはJSONArray あるオブジェクトことを確認することができ、私の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" 
     } 
    ] 
    } 
} 

です。

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

これはJSONを受け、チェックするために使用されているが、有効か無効

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; 
    } 
関連する問題