# jsonobject cannot be cast to java.lang.string



## mance (23. Mrz 2014)

Hey Leute ich vesuche Daten von einem PHP Script in meine App anzuzeigen dabei erhalte ich einen Fehler auf den ich keine Lösung finden kann. 
Hier der Code der Klasse:


```
package com.thegamefactory.geochallenge;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.concurrent.ExecutionException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.thegamefactory.beans.Score;

import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

public class HighscoreActivity extends Activity {
	private LinearLayout linearScore, linearName;
	private TextView textViewScore, textViewName;
	private ScrollView scrollView;
	private static String LINK = "****";
	private int score;
	private TextView textViewPersonalBest;
	private boolean isNewBest;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_highscore);
		linearName = (LinearLayout) findViewById(R.id.linearName);
		linearScore = (LinearLayout) findViewById(R.id.linearScore);
		scrollView = (ScrollView) findViewById(R.id.scrollView);
		textViewPersonalBest = (TextView) findViewById(R.id.textViewPersonalBest);
		score = getIntent().getExtras().getInt("score");
		isNewBest = false;
		if (score > getPersonalBest()) {
			setPersonalBest(score);
			isNewBest = true;
		}
		textViewPersonalBest.setText(getResources().getString(R.string.personal_best) + getPersonalBest());

		if (isNetworkAvailable())
			writeScores();
		else
			showError(getResources().getString(R.string.no_conn_error));

		if (isNewBest)
			showError(getResources().getString(R.string.new_personal_best_msg));
	}

	private int getPersonalBest() {
		SharedPreferences preferences = PreferenceManager
				.getDefaultSharedPreferences(getApplicationContext());
		int personalBest = preferences.getInt("personalBest", 0);
		return personalBest;
	}

	private void setPersonalBest(int updateScore) {
		SharedPreferences preferences = PreferenceManager
				.getDefaultSharedPreferences(getApplicationContext());
		SharedPreferences.Editor editor = preferences.edit();
		editor.putInt("personalBest", updateScore);
		editor.commit();
	}

	@SuppressWarnings("static-access")
	private void showError(String msg) {
		new Toast(getApplicationContext()).makeText(getApplicationContext(),
				msg, Toast.LENGTH_SHORT).show();
	}

	private boolean isNetworkAvailable() {
		ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo activeNetworkInfo = connectivityManager
				.getActiveNetworkInfo();
		return activeNetworkInfo != null && activeNetworkInfo.isConnected();
	}

	private void writeScores() {
		linearScore.removeAllViews();
		linearName.removeAllViews();
		scrollView.fullScroll(ScrollView.FOCUS_UP);
		DataGet dataget = new DataGet();
		dataget.execute(LINK);
		ArrayList<Score> liste = null;
		try {
			liste = dataget.get();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		int place = 1;
		for (int i = 0; i < liste.size(); i++) {
			String score = liste.get(i).getScore();
			String name = liste.get(i).getName();

			textViewName = new TextView(getApplicationContext());
			textViewName.setText(place + ". " + name);
			textViewName.setTextSize(20);
			linearName.addView(textViewName);

			textViewScore = new TextView(getApplicationContext());
			textViewScore.setText(score);
			textViewScore.setTextSize(20);
			linearScore.addView(textViewScore);

			place++;
		}
	}

}

class DataGet extends AsyncTask<String, Void, ArrayList<Score>> {

	@Override
	protected ArrayList<Score> doInBackground(String... urls) {
		InputStream is = null;
		String result = "";
		JSONObject json_data;
		ArrayList<Score> results = new ArrayList<Score>();

		ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

		try {
			HttpClient httpclient = new DefaultHttpClient();
			HttpPost httppost = new HttpPost(urls[0]);
			httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
			HttpResponse response = httpclient.execute(httppost);
			HttpEntity entity = response.getEntity();
			is = entity.getContent();
		} catch (Exception e) {
			Log.e("log_tag", "Fehler bei der http Verbindung " + e.toString());
		}
		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();
			result = sb.toString();
		} catch (Exception e) {
			Log.e("log_tag", "Error converting result " + e.toString());
		}

		try {
			JSONArray jArray = new JSONArray(result);
			for (int i = 0; i < jArray.length(); i++) {
				json_data = jArray.getJSONObject(i);
				Score score = new Score((String) json_data.get("nom"),
						(String) json_data.get("score"));
				results.add(score);
			}
		} catch (JSONException e) {
			Log.e("log_tag", "Error parsing data " + e.toString());
		}
		return results;
	}
}
```

Und hier das Stacktrace: 



> 03-23 22:35:32.914: W/CursorWrapperInner(21039): Cursor finalized without prior close()
> *03-23 22:35:33.304: W/System.err(21039): java.util.concurrent.ExecutionException: java.lang.ClassCastException: org.json.JSONObject$1 cannot be cast to java.lang.String*
> 03-23 22:35:33.304: W/System.err(21039): 	at java.util.concurrent.FutureTask.report(FutureTask.java:94)
> 03-23 22:35:33.304: W/System.err(21039): 	at java.util.concurrent.FutureTask.get(FutureTask.java:160)
> ...


----------



## ARadauer (24. Mrz 2014)

Score score = new Score((String) json_data.get("nom"),  (String) json_data.get("score"));

versuch da beidemal getString

klappt das?


----------



## dzim (24. Mrz 2014)

Oder verwende einen Mapper, dass du ein ordentliches Datenmodell erhälst (vielleicht zwar auf Kosten von ein wenig Performance, aber ich arbeite lieber mit einem Objekt, als mit dem Streambasierten Ansatz (das ist doch der Streambasierte, oder?)). Zum Beispiel über den Jackson-Parser. Wir haben das mal in einem nicht soo kleinen Projekt verwendet und ich habe sogar überhaupt kein Performance-Probleme feststellen können (jedenfalls keine, die dadurch begründet waren).


----------



## mance (26. Mrz 2014)

ARadauer hat gesagt.:


> Score score = new Score((String) json_data.get("nom"),  (String) json_data.get("score"));
> 
> versuch da beidemal getString
> 
> klappt das?



Vielen dank, ja das hat geklappt.


----------



## mance (26. Mrz 2014)

dzim hat gesagt.:


> Oder verwende einen Mapper, dass du ein ordentliches Datenmodell erhälst (vielleicht zwar auf Kosten von ein wenig Performance, aber ich arbeite lieber mit einem Objekt, als mit dem Streambasierten Ansatz (das ist doch der Streambasierte, oder?)). Zum Beispiel über den Jackson-Parser. Wir haben das mal in einem nicht soo kleinen Projekt verwendet und ich habe sogar überhaupt kein Performance-Probleme feststellen können (jedenfalls keine, die dadurch begründet waren).



Das werde ich bestimmt für zukünftige Projekte berücksichtigen, bei dem hier bleib ich aber lieber beim Stream-basierten Ansatz. Zumal ich es eh nur für die HighscoreActivity Klasse verwende. 
Aber danke für den Input.


----------

