Probleme beim Auslesen von JSON

S

Son Goku

Ambitioniertes Mitglied
5
Hallo

Ich sitze seit einigen Tagen an meinem ersten Android-App und hab ein kleines Problem, dass ich einfach nicht gelöst bekomme.

Der Quellcode soll folgende Funktion erfüllen:
Es soll ein Script auf einer Website kontaktiert werden, auf der verschiedene Infos bereitgestellt werden. Diese werden als JSON übermittelt und sollen später in einer ListActivity angezeigt werden.

Folgendes ist mein Quellcode:
Code:
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    String param1 = getIntent().getExtras().getString("param1");
    HttpGet httpGet = new HttpGet("http://10.0.2.2/app/kategorien.php?param=" + param1);
    String[] result = {};
    
    try {
      HttpClient httpClient = new DefaultHttpClient();
      HttpResponse response = httpClient.execute(httpGet);
      HttpEntity entity = response.getEntity();
      InputStream instream = entity.getContent();
      BufferedReader reader = new BufferedReader(new InputStreamReader(instream));
      StringBuilder sb = new StringBuilder();
      
      String line = null;
      while((line = reader.readLine()) != null) {
        sb.append(line);
      }
      String test = sb.toString();
      JSONObject json = new JSONObject(test);
      
      JSONArray nameArray = json.names();
      JSONArray valArray = json.toJSONArray(nameArray);
      
      for(int i = 0; i < valArray.length(); i++) {
        result[i] = valArray.getString(i);
      }
    } catch(ClientProtocolException e) {
      result[0] = &quot;test&quot;;
    } catch(IOException e) {
      result[0] = &quot;test2&quot;;
    } catch(JSONException e) {
      result[0] = &quot;test3&quot;;
    } catch(Exception e){
      result[0] = &quot;test4&quot;;
    } finally {
      httpGet.abort();
    }
    [...]
  }
Ich hab verschiedene Haltepunkt gesetzt. Der letzte, an dem meine App noch anhält ist in dieser Zeile:
Code:
JSONObject json = new JSONObject(test);
Danach bekomme ich die Meldeung &quot;Source not found&quot;.
Folgenden Stack zeigt mir Eclipse an:
Code:
Thread [<3> main] (Suspended (exception RuntimeException))    
    ActivityThread.performLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2496    
    ActivityThread.handleLaunchActivity(ActivityThread$ActivityRecord, Intent) line: 2512    
    ActivityThread.access$2200(ActivityThread, ActivityThread$ActivityRecord, Intent) line: 119    
    ActivityThread$H.handleMessage(Message) line: 1863    
    ActivityThread$H(Handler).dispatchMessage(Message) line: 99    
    Looper.loop() line: 123    
    ActivityThread.main(String[]) line: 4363    
    Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]    
    Method.invoke(Object, Object...) line: 521    
    ZygoteInit$MethodAndArgsCaller.run() line: 860    
    ZygoteInit.main(String[]) line: 618    
    NativeStart.main(String[]) line: not available [native method]
Was genau ist mein Problem und wie kann ich es lösen?

Den Beispielcode, wo ich mir einige Schnipsel kopiert habe, kann ich leider nicht mehr finden.

Viele Grüße
Son Goku

Edith hat nen Rechtschreibfehler gefunden.
 
Zuletzt bearbeitet:
1. Eclipse ist Scheiße ( als Entwicklungsumgebung )
2. Debugger gehören verboten
3. Log.d() strategosch patziert würde dir wesentlich mehr Infrormationen bitten (und schneller zum Ergebnis führen)

Als erstes würde ich einfach ausgeben, was du überhapt von dem Server gelesen hast.
 
Jo zeig uns mal den JSON Text
 
Was genau sagt denn die Fehlermeldung der RuntimeException? Und -siehe oben- wie sieht der JSON Text aus.
 
Das ist mein JSON-Text:
Code:
[{"key1":"aaa","val1":"bbb"},{"key1":"yyy","val1":"ccc gg"},{"key1":"a\u00fcs","val1":"byxcbb"},{"key1":"asdfg","val1":"l\u00d6p"}]
Der Quellcode zu dem JSON-Text:
Code:
<?php
$jsonText = array(
  array(
    "key1"  => "aaa",
    "val1"  => "bbb"
  ),
  array(
    "key1"  => "yyy",
    "val1"  => "ccc gg"
  ),
  array(
    "key1"  => utf8_encode("aüs"),
    "val1"  => "byxcbb"
  ),
  array(
    "key1"  => "asdfg",
    "val1"  => utf8_encode("lÖp")
  ),
);
  
$json = json_encode($jsonText);

header("Content-type: text/json; charset=utf-8;");
echo $json;
?>

@ko5tik: Log.d() muss ich mir mal anschauen. Danke für den Tipp.

@the_alien: Wenn ich wüsste, wo ich den einsehen kann, würde ich ihn Dir zeigen. Aber mir wird auch nur das angeziegt, was ich hier rein kopiert hab.
 
Na das sieht doch eher nach einem Json Array aus ;-)

Versuch mal
JSONArray jsonarr = new JSONArray(test);
Den restlichen code kannst dir dann eigentlich spaaren.
 
Es ist weniger interessant, wie du JSON produzuerst (wir sind hir nicht im PHP-Forum), sondern was bei deiner App ankommt
 
Autsch!
Ja genau, das wars.
Mit einigen Änderungen des Nachfolgenden Codes, läuft nun alles Problemlos.
Danke!

Aber eine Frage hätte ich noch.
Ich hab in der Nachfolgende neuen Schleife einen Array-Überlauf produziert, da wurde die Exception "Exception" korrekt abgefangen.

Für die Zeile
Code:
JSONObject json = new JSONObject(test);
will der Compiler auch unbedingt, dass ich eine "JSONException" abfange.
Es wird aber eine RuntimeException geworfen, die ich nicht abfangen kann.
Lt. Doku sollte diese auch nicht geworfen werden.

Was könnte da falsch gelaufen sein, bzw. was macht das für einen Sinn?
 
Natürlich kanst du auch eine RuntimeException abfangen - man sollte es aber nicht
tun.

RuntimeException kann jederzeit passieren, und der KOmpiler hat keine Möglichkeit zu überprüfen und dich dazu zwingen.
( Mehr dazu in dem Java-Buch deines vertrauens )
 
Diese konnte ich aber nicht abfangen.
Ich hab die Zeile eingefügt gehabt, sie wurde aber immer wieder ignoriert, also hab ich sie wieder entfernt.
Hab das Ganze auch eben wieder getestet.
 
Natürlich kannst du die fangen...

Code:
public class RuntimeExceptionTest {

	public static void main(String[] args) {
		try {
			throw new RuntimeException();
		} catch (RuntimeException e) {
			System.out.println("Exception gefangen");
		}
	}

}

Und den Stacktrace deiner Exception siehst du im Android Log. Entweder über "adb logcat" oder über den Logcat View in Eclipse.
 

Ähnliche Themen

H
Antworten
2
Aufrufe
1.307
Hcman
H
S
  • Sempervivum
Antworten
2
Aufrufe
605
Sempervivum
S
S
Antworten
4
Aufrufe
990
Sempervivum
S
Zurück
Oben Unten