web-dev-qa-db-ja.com

指定されたオブジェクトがJSON文字列のオブジェクトまたは配列であるかどうかを確認する方法

ウェブサイトからJSON文字列を取得しています。このようなデータがあります(JSON配列)

 myconf= {URL:[blah,blah]}

ただし、このデータは(JSONオブジェクト)になる場合があります

 myconf= {URL:{try}}

空にすることもできます

 myconf= {}    

オブジェクトの場合と配列の場合で異なる操作を実行したい。今までのコードでは、配列のみを考慮しようとしていたため、次の例外が発生します。しかし、オブジェクトや配列をチェックすることはできません。

次の例外が発生します

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

誰でもそれを修正する方法を提案できますか?ここでは、オブジェクトと配列がJSONオブジェクトのインスタンスであることを知っています。しかし、指定されたインスタンスが配列であるかオブジェクトであるかを確認できる関数を見つけることができませんでした。

このif条件を使用しようとしましたが、成功しませんでした

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

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
}
42
cHao

私も同じ問題を抱えていました。しかし、私は簡単な方法で修正しました。

私のjsonは以下のようでした:

[{"id":5,"excerpt":"excerpt here"}, {"id":6,"excerpt":"another excerpt"}]

時々、私は次のような応答を受け取りました:

{"id":7, "excerpt":"excerpt here"}

私もあなたのようにエラーになりました。最初に、それがJSONObjectJSONArrayかを確認する必要がありました。

JSON配列は[]でカバーされ、オブジェクトは{}でカバーされます

だから、私はこのコードを追加しました

if (response.startsWith("[")) {
  //JSON Array
} else {
  //JSON Object 
}

それは私にとってうまくいきました、そしてそれは単に簡単な方法なのであなたにも役立つことを望みます

String.startsWithの詳細については、こちらをご覧ください- https://www.w3schools.com/Java/ref_string_startswith.asp

6
AA Shakil

かなりいくつかの方法があります。

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
}
6
Oh Chin Boon

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

これは私の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"
      } 
    ]
  }
}

これで、どのオブジェクトがJSONObjectまたはJSONArrayであるかを確認できます。

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