3

私のJSONは次のようになります-

{"ipinfo": {
    "ip_address":"4.2.2.2",
     "ip_type":"Mapped",

                "Location":{

                            "continent":"north america",

                            "latitude":33.499,

                            "longitude":-117.662,

                        "CountryData":{

                                "country":"united states",

                                "country_code":"us"},

                        "region":"southwest",

                        "StateData":{

                                "state":"california",

                                "state_code":"ca"},

                        "CityData":{

                                "city":"san juan capistrano",

                                "postal_code":"92675",

                                "time_zone":-8}}

    }}

これは、JSONArray内のアイテムのメンバーにアクセスしようとする以下のコードです。

    try {
        String url = service + version + method + ipAddress + format;
        StringBuilder builder = new StringBuilder();
        httpclient = new DefaultHttpClient();
        httpget = new HttpGet(url);
        httpget.getRequestLine();
        response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            InputStream inputStream = entity.getContent();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            for (String line = null; (line = bufferedReader.readLine()) != null;) {
                builder.append(line).append("\n");
            }
            //Exception getting thrown in below line
            JSONArray jsonArray = new JSONArray(builder.toString());
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
            }
        }

    } catch (Exception e) {
        getLogger().log(LogLevel.ERROR, e.getMessage());
    } finally {
        bufferedReader.close();
        httpclient.getConnectionManager().shutdown();
    }

私は常にこの行で例外がスローされます-

JSONArray jsonArray = new JSONArray(builder.toString());

以下は、スローされる例外です

org.json.JSONException: A JSONArray text must start with '[' at character 1

誰かが私のコードで何が間違っているのか教えてもらえますか?そして、どうすればそれを改善できますか?

4

2 に答える 2

5

私はその特定のAPIを使用していませんが、オブジェクトの名前が(キーワード:配列)であるという事実から判断するとJSONArray、配列が必要であると推測します。JSONを使用する場合、配列はaで始まり、:[で終わる必要があります。]

[1, 2, 3, 4]

オブジェクトを含めることができます。

[{}, {}, {}]

配列とは異なり、オブジェクトがどのように始まり、{で終わるかに注意してください。}

{
    "name": "My Object!"
}

JSONデータはよりも似ている{object}ので、代わりに[array]使用してみてください。JSONObject

実際には2つのオプションがあります。JSONデータを配列に変更するか、Javaコードを変更して使用することができますJSONObject。(どちらか一方。両方ではありません。)

JSONデータの変更

[最初と]最後にを追加するのと同じくらい簡単です。

[
    {
        "ipinfo": {
            "ip_address": "4.2.2.2",
            "ip_type": "Mapped",
            "Location": {
                "continent": "north america",
                "latitude": 33.499,
                "longitude": -117.662,
                "CountryData": {
                    "country": "united states",
                    "country_code": "us"
                },
                "region": "southwest",
                "StateData": {
                    "state": "california",
                    "state_code": "ca"
                },
                "CityData": {
                    "city": "san juan capistrano",
                    "postal_code": "92675",
                    "time_zone": -8
                }
            }
        }
    }
]

Javaの変更

最終的なJavaは、次のようになります。

// OLD CODE
//JSONArray jsonArray = new JSONArray(builder.toString());
//for (int i = 0; i < jsonArray.length(); i++) {
//    JSONObject jsonObject = jsonArray.getJSONObject(i);
//}
// END OLD CODE
JSONObject jsonObject = new JSONObject(builder.toString());

(繰り返しますが、どちらか一方です。両方ではありません。)

于 2012-10-13T05:16:38.030 に答える
2

ソースJSONは単一のオブジェクトです。配列にロードする代わりに、に直接ロードするだけでJSONObject十分です。

JSONObject jsonObject = new JSONObject(builder.toString());

このオブジェクトには、という名前の単一のプロパティがありますipinfo

于 2012-10-13T05:15:43.997 に答える