1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Probleme beim Auslesen von JSON

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Son Goku, 07.12.2010.

  1. Son Goku, 07.12.2010 #1
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    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: 08.12.2010
  2. ko5tik, 07.12.2010 #2
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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.
     
  3. ts-apps, 07.12.2010 #3
    ts-apps

    ts-apps Erfahrener Benutzer

    Beiträge:
    194
    Erhaltene Danke:
    39
    Registriert seit:
    27.03.2010
    Jo zeig uns mal den JSON Text
     
  4. the_alien, 07.12.2010 #4
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    Was genau sagt denn die Fehlermeldung der RuntimeException? Und -siehe oben- wie sieht der JSON Text aus.
     
  5. Son Goku, 08.12.2010 #5
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    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.
     
  6. ts-apps, 08.12.2010 #6
    ts-apps

    ts-apps Erfahrener Benutzer

    Beiträge:
    194
    Erhaltene Danke:
    39
    Registriert seit:
    27.03.2010
    Na das sieht doch eher nach einem Json Array aus ;-)

    Versuch mal
    Den restlichen code kannst dir dann eigentlich spaaren.
     
  7. ko5tik, 08.12.2010 #7
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Es ist weniger interessant, wie du JSON produzuerst (wir sind hir nicht im PHP-Forum), sondern was bei deiner App ankommt
     
  8. Son Goku, 08.12.2010 #8
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    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?
     
  9. ko5tik, 08.12.2010 #9
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    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 )
     
  10. Son Goku, 08.12.2010 #10
    Son Goku

    Son Goku Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    5
    Registriert seit:
    07.12.2010
    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.
     
  11. the_alien, 08.12.2010 #11
    the_alien

    the_alien Android-Lexikon

    Beiträge:
    1,559
    Erhaltene Danke:
    184
    Registriert seit:
    04.05.2009
    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.
     

Diese Seite empfehlen