# JSON Code von Webseite in Java-Strings (Android)



## Noki99 (20. April 2014)

Hey Leute,

ich such mich schon seit ein paar Tagen durchs gesamte Internet, aber ich finde leider keine Funktionierende Lösung:

Ich habe folgende Seite: http://klassinator.bplaced.de/API/frage.php

Auf dieser Seite steht eine Frage mit 4 Antwortmöglichkeiten.

Wie bekomme ich diese in Android in Java-Strings? (Android)
Mag einfach klingen, aber ich steh aufm Schlauch :/


Danke für jede Antwort


----------



## saftmeister (20. April 2014)

Hi,

such mal nach dem Stichwort GSON.

EDIT: Und hier im Anhang ein kleines Beispiel-Projekt für Eclipse.

Falls du nur den Sourcecode haben willst:


```
package de.tutorials.gson;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

import com.google.gson.Gson;

public class GsonTest
{
    private class Frage
    {
        private String frage;

        private String antwort1;

        private String antwort2;

        private String antwort3;

        private String antwort4;

        public String getFrage()
        {
            return this.frage;
        }

        public void setFrage(String frage)
        {
            this.frage = frage;
        }

        public String getAntwort1()
        {
            return this.antwort1;
        }

        public void setAntwort1(String antwort1)
        {
            this.antwort1 = antwort1;
        }

        public String getAntwort2()
        {
            return this.antwort2;
        }

        public void setAntwort2(String antwort2)
        {
            this.antwort2 = antwort2;
        }

        public String getAntwort3()
        {
            return this.antwort3;
        }

        public void setAntwort3(String antwort3)
        {
            this.antwort3 = antwort3;
        }

        public String getAntwort4()
        {
            return this.antwort4;
        }

        public void setAntwort4(String antwort4)
        {
            this.antwort4 = antwort4;
        }
    }

    public static void main(String[] args)
    {
        try
        {
            URL url = new URL("http://klassinator.bplaced.de/API/frage.php");
            URLConnection urlConn = url.openConnection();
            InputStreamReader inStream = new InputStreamReader(
                    urlConn.getInputStream());
            BufferedReader buff = new BufferedReader(inStream);
            String nextLine;

            Gson gson = new Gson();

            while (true)
            {
                nextLine = buff.readLine();
                if (null != nextLine)
                {
                    Frage f = gson.fromJson(nextLine, Frage.class);

                    System.out.println("Frage: " + f.getFrage());
                }
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
```


----------



## Noki99 (20. April 2014)

saftmeister hat gesagt.:


> Hi,
> 
> such mal nach dem Stichwort GSON.



Vielen Dank, habe mir dass ding jetzt mit ner Youtube Anleitung insterliert (wenn man dass so nennen kann).

Nur wie genau bekomm ich damit jetzt meinen String mit der Frage? 
Sorry bin neu in dem Thema :/
Auch dass Tutorial (http://www.javacreed.com/simple-gson-example) hat mir irgendwie nicht weitergeholfen :/


Kannst du mir villeicht nen Codeschnipsel oder so geben? 


EDIT: Vielen Dank, werd mir dass gleich mal reinziehen


----------



## saftmeister (20. April 2014)

Noch mal Korrektur des Sources von oben, da die Anworten sonst null bleiben:


```
package de.tutorials.gson;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

import com.google.gson.Gson;

public class GsonTest
{
    private class Frage
    {
        private String frage;

        private String a1;

        private String a2;

        private String a3;

        private String a4;

        public String getFrage()
        {
            return this.frage;
        }

        public void setFrage(String frage)
        {
            this.frage = frage;
        }

        public String getA1()
        {
            return this.a1;
        }

        public void setA1(String antwort1)
        {
            this.a1 = antwort1;
        }

        public String getA2()
        {
            return this.a2;
        }

        public void setA2(String antwort2)
        {
            this.a2 = antwort2;
        }

        public String getA3()
        {
            return this.a3;
        }

        public void setA3(String antwort3)
        {
            this.a3 = antwort3;
        }

        public String getA4()
        {
            return this.a4;
        }

        public void setA4(String antwort4)
        {
            this.a4 = antwort4;
        }
    }

    public static void main(String[] args)
    {
        try
        {
            URL url = new URL("http://klassinator.bplaced.de/API/frage.php");
            URLConnection urlConn = url.openConnection();
            InputStreamReader inStream = new InputStreamReader(
                    urlConn.getInputStream());
            BufferedReader buff = new BufferedReader(inStream);
            String nextLine;

            Gson gson = new Gson();

            while (true)
            {
                nextLine = buff.readLine();
                if (null != nextLine)
                {
                    Frage f = gson.fromJson(nextLine, Frage.class);

                    System.out.println("Frage: " + f.getFrage() + ", a1 "
                            + f.getA1());
                }
            }
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
```

Evtl. musst du dir aber was generisches überlegen, da nicht jede Frage 4 Antworten haben muss und auch die Antwort-Tags nicht zwingend a1, a2,... usw lauten müssen.


----------



## Noki99 (20. April 2014)

Vielen Dank 

Hab dass mal bei mir in meinem Android Projekt reingeschrieben, nur leider kommen viele Fehler.
Da ich nicht alle hier reinschreiben kann, hab ich dir mal dass Projekt auf meinen Server hochgeladen:

http://klassinator.bplaced.net/Klassinator.zip

Wenn du es nicht runterladen willst kann ich dir auch Screenshots oder so geben.


Was mach ich falsch?


----------



## saftmeister (20. April 2014)

Versuch es mal damit


----------



## Noki99 (20. April 2014)

Hey, vielen Dank.

Habs einfach mal im Emulator laufen lassen, nur leider bleiben die 3 Punkte vom Layout da stehen, aber es kommt auch nirgendswo ein Fehler.


----------



## saftmeister (20. April 2014)

Grundsätzlich bei sowas ins Logcat von Eclipse schauen. Da steht der Grund für das Verhalten meistens drin. In dem Falle wars 

“Only the original thread that created a view hierarchy can touch its views.”

Hier kann man folgendermaßen abhelfen:


```
package com.example.klassinator;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.TextView;

import com.google.gson.Gson;

public class MainActivity extends Activity
{

    TextView Frage;

    private class JsonFrage
    {
        private String frage;

        private String a1;

        private String a2;

        private String a3;

        private String a4;

        public String getFrage()
        {
            return this.frage;
        }

        public void setFrage(String frage)
        {
            this.frage = frage;
        }

        public String getA1()
        {
            return this.a1;
        }

        public void setA1(String antwort1)
        {
            this.a1 = antwort1;
        }

        public String getA2()
        {
            return this.a2;
        }

        public void setA2(String antwort2)
        {
            this.a2 = antwort2;
        }

        public String getA3()
        {
            return this.a3;
        }

        public void setA3(String antwort3)
        {
            this.a3 = antwort3;
        }

        public String getA4()
        {
            return this.a4;
        }

        public void setA4(String antwort4)
        {
            this.a4 = antwort4;
        }
    }

    private class FetchQuestion extends AsyncTask<String, Void, Void>
    {
        private final Activity activity;

        public FetchQuestion(Activity activity)
        {
            this.activity = activity;
        }

        @Override
        protected Void doInBackground(String... urls)
        {
            try
            {
                URL url = new URL(urls[0]);
                URLConnection urlConn = url.openConnection();
                InputStreamReader inStream = new InputStreamReader(
                        urlConn.getInputStream());
                BufferedReader buff = new BufferedReader(inStream);
                String nextLine;

                Gson gson = new Gson();

                nextLine = buff.readLine();
                if (null != nextLine)
                {
                    final JsonFrage f = gson
                            .fromJson(nextLine, JsonFrage.class);

                    this.activity.runOnUiThread(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            MainActivity.this.Frage.setText(f.getFrage());
                        }
                    });
                }
            }
            catch (Exception ex)
            {
                ex.printStackTrace();
            }
            return null;
        }

    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.activity_main);

        this.Frage = (TextView) this.findViewById(R.id.frage);

        new FetchQuestion(this)
                .execute("http://klassinator.bplaced.de/API/frage.php");

    }

    public static void main(String[] args)
    {
    }

}
```


----------



## Noki99 (21. April 2014)

Vielen, vielen Dank! Funktioniert einbahnfrei


----------



## Noki99 (24. Juni 2014)

Hey, ich hätte dazu nochmal ne Frage.
Wenn dass Gerät keine Internetverbindung hat, passiert nichts. Wie kann ich erkennen, dass keine Daten kommen? 

Vileicht im catch{} - Teil abbrechen?


----------



## saftmeister (24. Juni 2014)

Es sollte ja zumindest der Exception-Stacktrace im logcat erscheinen. Wenn dem so ist, kannst du im catch ja eine Meldung anzeigen lassen: http://developer.android.com/reference/android/app/AlertDialog.html


----------

