Json Parser Exception无法解析

时间:2014-06-27 12:46:36

标签: android json parsing

此代码正在打印json解析器异常 在这段代码中,我想将纬度发送到服务器,但它会继续向我显示两个错误:

  1. Json异常无法解析
  2. 异步任务#1错误
  3. 你能告诉我我的错误吗?

    以下是我的相关代码:

                 package com.example.gpstracking;
    
    
          public class AndroidGPSTrackingActivity extends Activity {
    
    Button btnShowLocation;
    
    String lat = "";
    String lng = "";
    // GPSTracker class
    GPSTracker gps;
    private ProgressDialog pDialog;
    
    JSONParser jsonParser = new JSONParser();
    // JSONParser jsonParser = new JSONParser();
    private static String url_create_product = "http://dyandroidapps.netii.net/"
            + "android_db/DB_Functncreate1.php";
    // JSON Node names
    private static final String TAG_SUCCESS = "success";
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        btnShowLocation = (Button) findViewById(R.id.btnShowLocation);
    
        // show location button click event
        btnShowLocation.setOnClickListener(new View.OnClickListener() {
    
            @Override
            public void onClick(View v) {
                // create class object
                gps = new GPSTracker(AndroidGPSTrackingActivity.this);
    
                // check if GPS enabled
                if (gps.canGetLocation()) {
    
                    double latitude = gps.getLatitude();
                    double longitude = gps.getLongitude();
                     lat = Double.toString(latitude);
                     lng = Double.toString(longitude);
    
                    Toast.makeText(
                            getApplicationContext(),
            "Your Location is " + "- \nLat: " +  latitude
                + "\nLong: " + longitude, Toast.LENGTH_LONG)
                            .show();
                    new CreateNewProduct().execute();
                    // postData(lat, lng);
    
                } else {
                    // can't get location
                    // GPS or Network is not enabled
                    // Ask user to enable GPS/network in settings
                    gps.showSettingsAlert();
                }
    
            }
        });
    }
    
    /*
     * public void postData(String lat, String lng) { // Create a new HttpClient
     * and Post Header HttpClient httpclient = new DefaultHttpClient();
     * 
     * HttpPost httppost = new
     * HttpPost("http://dyandroidappa.netii.net/android_db/create_product.php");
     * 
     * try {
     * 
     * // Execute HTTP Post Request // HttpResponse response =
     * httpclient.execute(htget); HttpResponse response =
     * httpclient.execute(httppost); // String resp =
     * response.getStatusLine().toStrinkatyg(); try this // now //
     * Toast.makeText(this, resp, 5000).show();
     * 
     * } catch (ClientProtocolException e) { Toast.makeText(this, "Error",
     * 5000).show(); } catch (IOException e) { Toast.makeText(this, "Error",
     * 5000).show(); } }
     */
    
    class CreateNewProduct extends AsyncTask<String, String, String> {
    
        // * Before starting background thread Show Progress Dialog
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(AndroidGPSTrackingActivity.this);
            pDialog.setMessage("Sending markers..");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }
    
        // * Creating product
    
        protected String doInBackground(String... args) {
    
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("lat", lat));
            params.add(new BasicNameValuePair("lng", lng));
    
            // params.add(new BasicNameValuePair("description", description));
    
            // getting JSON Object
            // Note that create product url accepts POST method
            JSONObject json = jsonParser.makeHttpRequest(url_create_product,
                    "POST", params);
    
            // check log cat from response
            Log.d("Create Response", json.toString());
    
            // check for success tag
            try {
                int success = json.getInt(TAG_SUCCESS);
    
                if (success == 1) {
                    // successfully created product
                    Toast.makeText(getApplicationContext(), "Data Posted",
                            Toast.LENGTH_SHORT).show();
    
                    // closing this screen
                    finish();
                } else {
                    // failed to create product
                    Toast.makeText(getApplicationContext(), "Data not Posted",
                            Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), "Json Exception",
                        Toast.LENGTH_SHORT).show();
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), "Only Exception",
                        Toast.LENGTH_SHORT).show();
    
            }
    
            return null;
        }
    
        // After completing background task Dismiss the progress dialog
    
        protected void onPostExecute(String file_url) {
            // dismiss the dialog once done
            pDialog.cancel();
        }
    }
    
    }
    

    我的jsonparser类是

        public class JSONParser {
    
    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
    
    // constructor
    public JSONParser() {
    
    }
    
    // function get json from url
    // by making HTTP POST or GET mehtod
    public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {
    
        // Making HTTP request
        try {
    
            // check for request method
            if (method == "POST") {
                // request method is POST
                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                //HttpPost httpPost = new HttpPost(url);
        //      httpPost.setHeader("Content-type","application/json");
                httpPost.setHeader("Content-type","application/json");
                httpPost.setEntity(new UrlEncodedFormEntity(params));
    
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
    
            } else if (method == "GET") {
                // request method is GET
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);
    
                httpGet.setHeader("Content-type","application/json");
                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }
    
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }
    
        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }
    
        // return JSON String
        return jObj;
    
     }
    }
    

    我的logcat是

    06-27 18:13:28.160: E/JSON Parser(2583): Error parsing data org.json.JSONException: End of input at character 0 of 
    06-27 18:13:28.170: W/dalvikvm(2583): threadid=11: thread exiting with uncaught exception (group=0x41b132b8)
    06-27 18:13:28.180: E/AndroidRuntime(2583): FATAL EXCEPTION: AsyncTask #1
    06-27 18:13:28.180: E/AndroidRuntime(2583): java.lang.RuntimeException: An error occured while executing doInBackground()
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at android.os.AsyncTask$3.done(AsyncTask.java:299)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at java.lang.Thread.run(Thread.java:856)
    06-27 18:13:28.180: E/AndroidRuntime(2583): Caused by: java.lang.NullPointerException
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at com.example.gpstracking.AndroidGPSTrackingActivity$CreateNewProduct.doInBackground(AndroidGPSTrackingActivity.java:131)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at com.example.gpstracking.AndroidGPSTrackingActivity$CreateNewProduct.doInBackground(AndroidGPSTrackingActivity.java:1)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at android.os.AsyncTask$2.call(AsyncTask.java:287)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
    06-27 18:13:28.180: E/AndroidRuntime(2583):     ... 4 more
    06-27 18:13:35.250: E/WindowManager(2583): Activity com.example.gpstracking.AndroidGPSTrackingActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42554568 that was originally added here
    06-27 18:13:35.250: E/WindowManager(2583): android.view.WindowLeaked: Activity com.example.gpstracking.AndroidGPSTrackingActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@42554568 that was originally added here
    06-27 18:13:35.250: E/WindowManager(2583):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:418)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:322)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:234)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:153)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.view.Window$LocalWindowManager.addView(Window.java:559)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.app.Dialog.show(Dialog.java:300)
    06-27 18:13:35.250: E/WindowManager(2583):  at com.example.gpstracking.AndroidGPSTrackingActivity$CreateNewProduct.onPreExecute(AndroidGPSTrackingActivity.java:109)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.os.AsyncTask.execute(AsyncTask.java:534)
    06-27 18:13:35.250: E/WindowManager(2583):  at com.example.gpstracking.AndroidGPSTrackingActivity$1.onClick(AndroidGPSTrackingActivity.java:64)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.view.View.performClick(View.java:4295)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.view.View$PerformClick.run(View.java:17456)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.os.Handler.handleCallback(Handler.java:615)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.os.Handler.dispatchMessage(Handler.java:92)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.os.Looper.loop(Looper.java:174)
    06-27 18:13:35.250: E/WindowManager(2583):  at android.app.ActivityThread.main(ActivityThread.java:4952)
    06-27 18:13:35.250: E/WindowManager(2583):  at java.lang.reflect.Method.invokeNative(Native Method)
    06-27 18:13:35.250: E/WindowManager(2583):  at java.lang.reflect.Method.invoke(Method.java:511)
    06-27 18:13:35.250: E/WindowManager(2583):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
    06-27 18:13:35.250: E/WindowManager(2583):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
    06-27 18:13:35.250: E/WindowManager(2583):  at dalvik.system.NativeStart.main(Native Method)
    06-27 18:13:35.290: D/dalvikvm(2583): GC_CONCURRENT freed 189K, 10% free 9914K/11015K, paused 13ms+2ms, total 58ms
    

    如果需要其他代码,我只有一个代码发布在这里,请建议我

    package com.example.gpstracking;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.net.HttpURLConnection;
    import java.net.MalformedURLException;
    import java.net.URL;
    
    import android.app.AlertDialog;
    import android.app.Service;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.location.Location;
    import android.location.LocationListener;
    import android.location.LocationManager;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.provider.Settings;
    import android.util.Log;
    
    public class GPSTracker extends Service implements LocationListener {
    
        private final Context mContext;
    
        // flag for GPS status
        boolean isGPSEnabled = false;
    
        // flag for network status
        boolean isNetworkEnabled = false;
    
        // flag for GPS status
        boolean canGetLocation = false;
    
        Location location; // location
        double latitude; // latitude
        double longitude; // longitude
    
        // The minimum distance to change Updates in meters
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
    
        // The minimum time between updates in milliseconds
        private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
    
        // Declaring a Location Manager
        protected LocationManager locationManager;
    
        public GPSTracker(Context context) {
            this.mContext = context;
            getLocation();
        }
    
        public Location getLocation() {
            try {
                locationManager = (LocationManager) mContext
                        .getSystemService(LOCATION_SERVICE);
    
                // getting GPS status
                isGPSEnabled = locationManager
                        .isProviderEnabled(LocationManager.GPS_PROVIDER);
    
                // getting network status
                isNetworkEnabled = locationManager
                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    
                if (!isGPSEnabled && !isNetworkEnabled) {
                    // no network provider is enabled
                } else {
                    this.canGetLocation = true;
                    if (isNetworkEnabled) {
                        locationManager.requestLocationUpdates(
                                LocationManager.NETWORK_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("Network", "Network");
                        if (locationManager != null) {
                            location = locationManager
                                    .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                    // if GPS Enabled get lat/long using GPS Services
                    if (isGPSEnabled) {
                        if (location == null) {
                            locationManager.requestLocationUpdates(
                                    LocationManager.GPS_PROVIDER,
                                    MIN_TIME_BW_UPDATES,
                                    MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                            Log.d("GPS Enabled", "GPS Enabled");
                            if (locationManager != null) {
                                location = locationManager
                                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                if (location != null) {
                                    latitude = location.getLatitude();
                                    longitude = location.getLongitude();
                                }
                            }
                        }
                    }
                }
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
            return location;
        }
    
        /**
         * Stop using GPS listener Calling this function will stop using GPS in your
         * app
         * */
        public void stopUsingGPS() {
            if (locationManager != null) {
                locationManager.removeUpdates(GPSTracker.this);
            }
        }
    
        /**
         * Function to get latitude
         * */
        public double getLatitude() {
            if (location != null) {
                latitude = location.getLatitude();
            }
    
            // return latitude
            return latitude;
        }
    
        /**
         * Function to get longitude
         * */
        public double getLongitude() {
            if (location != null) {
                longitude = location.getLongitude();
            }
    
            // return longitude
            return longitude;
        }
    
        /**
         * Function to check GPS/wifi enabled
         * 
         * @return boolean
         * */
        public boolean canGetLocation() {
            return this.canGetLocation;
        }
    
        /**
         * Function to show settings alert dialog On pressing Settings button will
         * lauch Settings Options
         * */
        public void showSettingsAlert() {
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
    
            // Setting Dialog Title
            alertDialog.setTitle("GPS is settings");
    
            // Setting Dialog Message
            alertDialog
                    .setMessage("GPS is not enabled. Do you want to go to settings menu?");
    
            // On pressing Settings button
            alertDialog.setPositiveButton("Settings",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            Intent intent = new Intent(
                                    Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            mContext.startActivity(intent);
                        }
                    });
    
            // on pressing cancel button
            alertDialog.setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }
                    });
    
            // Showing Alert Message
            alertDialog.show();
        }
    
        @Override
        public void onLocationChanged(Location location) {
    
        }
    
        @Override
        public void onProviderDisabled(String provider) {
        }
    
        @Override
        public void onProviderEnabled(String provider) {
        }
    
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    
        @Override
        public IBinder onBind(Intent arg0) {
            return null;
        }
    
    
    
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

我不确定,但也许问题在于:

    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("lat", lat));
    params.add(new BasicNameValuePair("lng", lng));

在你的主要行为中,我没有看到你设置这些&#39; lat&#39;和&#39; lng&#39;变量(有注释行):

double latitude = gps.getLatitude();
double longitude = gps.getLongitude();
// lat = Double.toString(latitude);
// lng = Double.toString(longitude);

因此,正如开头所宣布的那样,这两者总是一样的:

String lat = "";
String lng = "";

除此之外,你的131行还有一个NullPointerException。请发布。