0

サーバーからいくつかの json データを解析するときに深刻な問題に直面しています。サーバーがjsonデータを返すと、プログラムはそれを適切に処理しますが、サーバーがnullを返すと、アプリで例外が発生します。

多くの質問と回答を検索しました。最大の回答は、JSON の null 戻り値の型を処理するために isNull() メソッドを使用すると言っています。しかし、isNull メソッドを記述する前に、次のように記述する必要があります。

  JSONObject json = new JSONObject("returned string");

この文は、解析対象のデータがある場合は正常に機能しますが、文字列が null の場合は例外が発生します。

私の質問は、理解するのに混乱を招く可能性があると思います。だから私はここに私のコードを少し与えています。

    URL Url = new URL(URL + "?userId=3");
    HttpURLConnection urlConnection = (HttpURLConnection) Url.openConnection();
    urlConnection.setRequestMethod("GET");
    urlConnection.connect();
    // gets the server json data

    StringBuilder sb = new StringBuilder();
    BufferedReader bufferedReader = new BufferedReader(
    new InputStreamReader(urlConnection.getInputStream()));


    String next = "";

    while ((next = bufferedReader.readLine()) != null)
            {
        StringTokenizer tokens = new StringTokenizer(next);
        while(tokens.hasMoreTokens()) 
             {
          Log.d("Tokens", tokens.nextToken());
         }

       Log.d("next value", next);

       JSONObject json = new JSONObject(next);
       if (json.isNull("Location")) {

       Log.d("Json is null", "Ok");
       serverLatitude = String.valueOf(lati);
       serverLongitude = String.valueOf(longi);
           }
           else {

        Log.d("Json not null", "Ok");
        lat = json.getString("Latitude");
        lon = json.getString("Longitude");

        if (lat != null && lon != null) {
        serverLatitude = lat;
        serverLongitude = lon;

        } else {

               }
          } 

サーバーにデータがある場合は正常に動作しますが、サーバーが null を返すとエラーが発生します。この問題を処理する方法を教えてください。

編集

これは、サーバーが null を返したときの logcat です。

  08-26 14:53:22.996: D/Tokens(31397): null
  08-26 14:53:22.996: D/next value(31397): null
  08-26 14:53:22.996: D/Here lat(31397): 12.90871405
  08-26 14:53:22.996: W/System.err(31397): org.json.JSONException: Value null of type          org.json.JSONObject$1 cannot be converted to JSONObject
  08-26 14:53:22.996: W/System.err(31397):  at      org.json.JSON.typeMismatch(JSON.java:107)
  08-26 14:53:22.996: W/System.err(31397):  at org.json.JSONObject.<init>   (JSONObject.java:158)
  08-26 14:53:22.996: W/System.err(31397):  at org.json.JSONObject.<init>(JSONObject.java:171)
  08-26 14:53:22.996: W/System.err(31397):  at com.monday.trackloc.NewService$FetchCordinates.fetchLastInsertedRow(NewService.java:264)
  08-26 14:53:22.996: W/System.err(31397):  at com.monday.trackloc.NewService$FetchCordinates.insertDataToServer(NewService.java:126)
  08-26 14:53:22.996: W/System.err(31397):  at com.monday.trackloc.NewService$FetchCordinates.onPostExecute(NewService.java:108)
  08-26 14:53:22.996: W/System.err(31397):  at com.monday.trackloc.NewService$FetchCordinates.onPostExecute(NewService.java:1)
  08-26 14:53:22.996: W/System.err(31397):  at android.os.AsyncTask.finish(AsyncTask.java:417)
  08-26 14:53:22.996: W/System.err(31397):  at android.os.AsyncTask.access$300(AsyncTask.java:127)
  08-26 14:53:22.996: W/System.err(31397):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
  08-26 14:53:23.006: W/System.err(31397):  at android.os.Handler.dispatchMessage(Handler.java:99)
  08-26 14:53:23.006: W/System.err(31397):  at android.os.Looper.loop(Looper.java:130)
  08-26 14:53:23.006: W/System.err(31397):  at android.app.ActivityThread.main(ActivityThread.java:3806)
  08-26 14:53:23.006: W/System.err(31397):  at java.lang.reflect.Method.invokeNative(Native Method)
  08-26 14:53:23.006: W/System.err(31397):  at java.lang.reflect.Method.invoke(Method.java:507)
  08-26 14:53:23.006: W/System.err(31397):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  08-26 14:53:23.006: W/System.err(31397):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  08-26 14:53:23.006: W/System.err(31397):  at dalvik.system.NativeStart.main(Native Method)
  08-26 14:53:23.006: D/AndroidRuntime(31397): Shutting down VM
  08-26 14:53:23.006: W/dalvikvm(31397): threadid=1: thread exiting with uncaught exception (group=0x40018560)
  08-26 14:53:23.006: E/AndroidRuntime(31397): FATAL EXCEPTION: main
  08-26 14:53:23.006: E/AndroidRuntime(31397): java.lang.NumberFormatException: 
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at java.lang.Double.parseDouble(Double.java:318)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at com.monday.trackloc.NewService$FetchCordinates.insertDataToServer(NewService.java:130)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at com.monday.trackloc.NewService$FetchCordinates.onPostExecute(NewService.java:108)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at com.monday.trackloc.NewService$FetchCordinates.onPostExecute(NewService.java:1)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at android.os.AsyncTask.finish(AsyncTask.java:417)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at android.os.AsyncTask.access$300(AsyncTask.java:127)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at android.os.Handler.dispatchMessage(Handler.java:99)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at android.os.Looper.loop(Looper.java:130)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at android.app.ActivityThread.main(ActivityThread.java:3806)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at java.lang.reflect.Method.invokeNative(Native Method)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at java.lang.reflect.Method.invoke(Method.java:507)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  08-26 14:53:23.006: E/AndroidRuntime(31397):  at dalvik.system.NativeStart.main(Native Method)

ありがとうございました

4

1 に答える 1

0

別の方法で解決しましたが、問題なく動作しています。

最初は弦に集中する必要があったと思います。

解決は次のようになります。

while ((next = bufferedReader.readLine()) != null) {

  Log.d("next value", next);
  Log.d("Here lat", String.valueOf(lati));
  if (!next.contentEquals("null")) {
  JSONObject json = new JSONObject(next);
  Log.d("Json not null", "Ok");
  serverLatitude = json.getString("Latitude");
  serverLongitude = json.getString("Longitude");

      } else {
    emptyRow = true;
    Log.d("Json is null", "Ok");
    serverLatitude = String.valueOf(lati);
    serverLongitude = String.valueOf(longi);
    }
}

実際に返される文字列に「null」が含まれていることがわかりました。したがって、「null」をif条件に入れるだけで、完全に機能するようになりました。

これがこの問題を解決する完璧な方法ではないことはわかっています。この問題に対する適切な解決策がある場合は、ここに提供してください。ありがとうございました

于 2013-08-26T11:18:40.867 に答える