web-dev-qa-db-ja.com

タイプorg.json.JSONObject $ 1のnull値はJSONObjectに変換できません

OpenWeatherMap APIを使用すると、この例外エラーが発生します。 resultをJSONObjectにしようとしていますが、-nullが増え続けています。

@Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        // What's coming in as result...
        // Printed to the console...
        // null{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":800,"main":"Clear",
        // "description":"clear sky","icon":"01d"}],...}


        try {
            JSONObject jsonObject = new JSONObject(result);
            String weatherInfo = jsonObject.getString("weather");

            Log.i("Weather Info", weatherInfo);
        } catch (JSONException e) {
            e.printStackTrace();
        }

   }

JSONデータは問題なく取り込まれますが、JSONObjectになることだけが必要ですが、null部分がキャッチされます。なぜそれが起こっているのでしょうか?

また、サイトからJSON Response入ってくる:

{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":800,"main":"Clear","description":"clear sky","icon":"01d"}],.....}

なぜ最初はnullがないのですか?ご協力ありがとうございました。

8
SmiffyKmc

あなたが受け取るデータで天気はJSONArrayです。

これを試して :

 String json = "{\"coord\":{\"lon\":-0.13,\"lat\":51.51},\"weather\":[{\"id\":800,\"main\":\"Clear\",\"description\":\"clear sky\",\"icon\":\"01d\"}],.....}";

try{
    JSONObject jo = new JSONObject(json);
    JSONArray weather = jo.getJSONArray("weather");
    for(int i = 0;i < weather.length(); i++){
        JSONObject w = weather.getJSONObject(i);
        String main = w.getString("main");
        String description = w.getString("description");
        //...
    }
}catch (Exception e){

}

サーバーから返された結果がnullで始まる場合は、この例外org.json.JSONException: Value null of type org.json.JSONObject$1 cannot be converted to JSONObject

これは、この結果が有効なJSONコンテンツではないためです。

サーバーからこの無効なコンテンツを実際に受け取った場合の回避策は、JSONを解析する前にnullを削除することです。

String crappyPrefix = "null";

if(result.startsWith(crappyPrefix)){
    result = result.substring(crappyPrefix.length(), result.length());
}
JSONObject jo = new JSONObject(result);
6

これを試してください(私にとってはうまくいきました)。同じ問題が発生していました

public class DownloadData extends AsyncTask<String , Void, String >{

        HttpURLConnection httpURLConnection =null;
        URL url;


String resultString="";  <------- instead of setting it to null


        @Override
        protected String doInBackground(String... urls) {


            try {
                url = new URL(urls[0]);
                httpURLConnection = (HttpURLConnection) url.openConnection();
                InputStream is = httpURLConnection.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);
                int data = isr.read();
                while(data != -1){
                    char ch = (char) data;
                    resultString += ch;
                    data = isr.read();

                }
                return resultString;



            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            return null;
        }
3
Amit Kumar

これを試して、

JSONObject jsonObject = new JSONObject(result);
        try {
            JSONArray jsonArray = jsonObject.getJSONArray("weather");

            for(int i=0;i<jsonArray.length();i++){
                JSONObject object=jsonArray.getJSONObject(i);
                String main =object.getString("main");
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
1
Pradeep Gupta

時には問題はあなたの応答がnullであることですが、あなたはJSONObjectを期待しています。サーバー側でそれを解決するためのベター。サーバー側のコードを編集できない場合は、 この質問 および これ が役立つ場合があります

1
masoudmjm

エラーは、JSONが無効であることを意味しますおそらく

JSON形式 ここ をテストできます。

しかし、コードの問題は、ここでgetString()を使用しようとしていることです

String weatherInfo = jsonObject.getString("weather");

天気は実際にはJSONArrayですが、文字列として使用する場合は

String weatherInfo = jsonObject.getJSONArray("weather").toString();