I have a problem with parsing data to JSON php server. When i try to send the data parameter then the error appear. I see the log cat and i think the error is in the json format. But how i can change the php code or java code?
NOTE: i send latitude, longitude and a context, example: 112, 75, "work"
Log cat
04-23 21:55:01.369: ERROR/JSON Parser(415): Error parsing data org.json.JSONException: Value Array of type java.lang.String cannot be converted to JSONObject
04-23 21:55:01.421: WARN/dalvikvm(415): threadid=12: thread exiting with uncaught exception (group=0x40015560)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): FATAL EXCEPTION: AsyncTask #1
04-23 21:55:01.449: ERROR/AndroidRuntime(415): java.lang.RuntimeException: An error occured while executing doInBackground()
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at android.os.AsyncTask$3.done(AsyncTask.java:200)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at java.lang.Thread.run(Thread.java:1019)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): Caused by: java.lang.NullPointerException
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at com.locationReminder.viewPOI$LoadAllPOI.doInBackground(viewPOI.java:96)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at com.locationReminder.viewPOI$LoadAllPOI.doInBackground(viewPOI.java:1)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
04-23 21:55:01.449: ERROR/AndroidRuntime(415): ... 4 more
This is the php code
$_POST['lat'] = 112;
$_POST['lng'] = -70;
$lat = $_POST['lat'];
$lng = $_POST['lng'];
$konteks = $_POST['konteks'];
$data = array();
$hasilHitung = array();
if (isset($_POST['lat']) && isset ($_POST['lng']) && isset ($_POST['konteks'])) {
$result = mysql_query("select * from poi where konteks_lokasi = '".$_POST['konteks']."'") or die(mysql_error());
if(mysql_num_rows($result) > 0){
while($row = mysql_fetch_assoc($result)) {
array_push($data, array('latitude' => $row['latitude'], 'longitude' => $row['longitude'], 'nama_lokasi' => $row['nama_lokasi'], 'konteks_lokasi' => $row['konteks_lokasi']));
}
} else {
$response["success"] = 0;
$response["message"] = "Tidak ada lokasi berkaitan";
echo json_encode($response);
}
for($i=0; $i<count($data); $i++) {
$hasil = calDistance($lat, $lng, $data[$i]);
floor($hasil);
$hasilHitung[$i] = $hasil;
}
asort($hasilHitung);
print_r($hasilHitung);
for($a=0; $a<count($hasilHitung); $a++) {
$response["point"] = array();
array_push($response["point"], $data);
}
$response["success"] = 1;
echo json_encode($response);
}
function calDistance($lt, $ln, $data) {
$distance = sqrt(pow(($data['latitude'] - $lt), 2) + pow(($data['longitude'] - $ln), 2));
return $distance;}
And the java code
class LoadAllPOI extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progress = new ProgressDialog(viewPOI.this);
progress.setMessage("Mengambil data...");
progress.setIndeterminate(false);
progress.setCancelable(false);
progress.show();
}
@Override
protected String doInBackground(String... args) {
// TODO Auto-generated method stub
//mendapatkan data dari database berupa alamat, konteks, latitude, longitude
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("lat", Integer.toString(latPengguna)));
params.add(new BasicNameValuePair("lng", Integer.toString(lngPengguna)));
params.add(new BasicNameValuePair("konteks", konteksCocok));
JSONObject json = jParser.makeHttpRequest(url_webservice, "POST", params);
Log.d("data: ", json.toString());
try {
int sukses = json.getInt(TAG_SUCCESS);
if(sukses == 1) {
POI = json.getJSONArray(TAG_POIN);
for(int i = 0; i < POI.length(); i++) {
JSONObject c = POI.getJSONObject(i);
int latDB = c.getInt(TAG_LAT);
int lngDB = c.getInt(TAG_LNG);
String alamat = c.getString(TAG_ALAMAT);
String konteks = c.getString(TAG_KONTEKS);
//buat fungsi k-NN setelah mendapatkan data dari database dengan parameter latitude, longitude, konteks
Log.d("latPengguna", "data: " + latPengguna);
Log.d("lngPengguna", "data: " + lngPengguna);
Log.d("latDB", "data: " + latDB);
Log.d("lngDB", "data: " + lngDB);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_ALAMAT, alamat);
map.put(TAG_KONTEKS, konteks);
POIList.add(map);
}
} else {
Log.d("JSON error", "JSON trouble");
}
} catch(JSONException ex) {
ex.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
progress.dismiss();
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//menampilkan data ke listView
ListAdapter adapter = new SimpleAdapter(viewPOI.this, POIList,
R.layout.list_item, new String[]{TAG_ALAMAT, TAG_KONTEKS},
new int[]{R.id.alamatPOI, R.id.konteksPOI});
setListAdapter(adapter);
}
});
}
The JSONPArser class
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
public JSONParser() {
}
public JSONObject makeHttpRequest(String url, String method, List<NameValuePair> params) {
try {
if(method == "POST"){
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}else if(method == "GET"){
DefaultHttpClient httpClient = new DefaultHttpClient();
String paramString = URLEncodedUtils.format(params, "utf-8");
url += "?" + paramString;
HttpGet httpGet = new HttpGet(url);
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 {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
}
return jObj;
}
}
The json data response
{
"point": [
[
{
"latitude": "112",
"longitude": "75",
"nama_lokasi": "ITS",
"konteks_lokasi": "kuliah"
},
{
"latitude": "145",
"longitude": "-80",
"nama_lokasi": "Teknik Kimia",
"konteks_lokasi": "kuliah"
}
]
],
"success": 1
}
i'm so glad if you could help me... Thanks
JSONObject json = jParser.makeHttpRequest(url_webservice, "POST", params);
- can you check, if the jParser is not null, - whatmakeHttpRequest
returns you ? String ? - it needs to be like that within the methodJSONObject json = new JSONObject(responseStringFromServer);
– osayilgan Apr 23 at 15:41