JSON Ausgabe in ListView anzeigen

D

DrLiightninG

Neues Mitglied
1
Hallo zusammen,
ich habe versucht die Daten aus meiner MySQL Datenbank mit JSON auszulesen und die Objekte anschließend in einer ListView anzeigen zu lassen. Mittlerweile funktioniert es, dass ich die Daten aus der Datenbank auslesen kann. Jedoch lassen sich diese bei mir noch nicht in einer ListView anzeigen, da diese anscheinend leer bleibt.
Den Fehler habe ich bisher noch nicht gefunden.

An dieser Stelle soll die JSON Ausgabe in "MainActivity/PlaceholderFragment" erfolgen:
Code:
else if(getArguments().getInt(ARG_SECTION_NUMBER) == 2) {
                rootView = inflater.inflate(R.layout.fragment_second, container, false);

                aktualisierenB = (Button) rootView.findViewById(R.id.refresh_b);
                partyList = (ListView) rootView.findViewById(R.id.listView);
                partyAdapter = new PartyAdapter(getActivity(),R.layout.list_item);
                partyList.setAdapter(partyAdapter);
                method = "suchen";

                aktualisierenB.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        // Perform action on click
                        BackgroundTask backgroundTask = new BackgroundTask(getActivity());
                        setzeBackgroundTask(backgroundTask);
                        backgroundTask.execute(method);
                    }
                });

                BackgroundTask backgroundTask = new BackgroundTask(getActivity());
                backgroundTask.getJsonString(this);
                backgroundTask.execute(method);

                return rootView;
            }

Ebenfalls aus "MainActivity/PlaceholderFragment":
Code:
public void setzeBackgroundTask(BackgroundTask bT) { //Übergibt die Klasse "MainActivity.PlaceholderFragment" an "BackgroundTask", um später die Methode "setzeString" aufrufen zu können
            bT.getJsonString(this);
        }

        public void setzeString(String str) { //wird von "BackgroundTask" aufgerufen, um den JSON String zu übergeben
            json_string = str;
            this.parseJSON();
        }

        public void parseJSON() { //Umwandlung von JSON String in eine ListView
            if(json_string == null) {
                Toast.makeText(getActivity().getApplicationContext(), "Keine Partys gefunden",
                        Toast.LENGTH_LONG).show();
            }
            else { //Suchergebnisse anzeigen
                //aktualisierenB.setText(json_string);

                Toast.makeText(getActivity().getApplicationContext(), "Partys anzeigen",
                        Toast.LENGTH_LONG).show(); //Diese Ausgabe erhalte ich in der App, sehe jedoch keine ListView

                JSONObject jsonObject;
                JSONArray jsonArray;

                String partyName;
                String clubName;
                String veranstalter;
                String datum;
                String zeit;
                String adresse;
                String stadt;
                String plz;
                String ticketverkauf;
                String age;
                int zusagen;
                int id;

                try {
                    jsonObject = new JSONObject(json_string);
                    jsonArray = jsonObject.getJSONArray("server_response");
                    int count = 0;
                    while(count < jsonObject.length()) {
                        JSONObject JO = jsonArray.getJSONObject(count);
                        partyName = JO.getString("party_name");
                        clubName = JO.getString("club_name");
                        veranstalter = JO.getString("veranstalter");
                        datum = JO.getString("datum");
                        zeit = JO.getString("zeit");
                        adresse = JO.getString("adresse");
                        stadt = JO.getString("stadt");
                        plz = JO.getString("plz");
                        ticketverkauf = JO.getString("ticketverkauf");
                        age = JO.getString("age");
                        id = JO.getInt("id");
                        zusagen = JO.getInt("zusagen");

                        PartyItem partyItem = new PartyItem(partyName,zeit,adresse);
                        partyAdapter.add(partyItem);
                        count ++;

                    }
                } catch (JSONException e){
                    e.printStackTrace();
                }
            }
        }

Aus "BackgroundTask":
Code:
public void getJsonString(MainActivity.PlaceholderFragment act) { //Übergabe von "MainActivity.PlaceholderFragment" an "BackgroundTask"
        activity = act;
    }

Aus der Methode "doInBackground" von "BackgroundTask":
Code:
else if(method.equals("suchen")) { //Hier werden die Daten der MySQL Datenbank ausgelesen
            try {

                suchen = true;
                URL url = new URL(json_url);
                HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
                InputStream inputStream = httpURLConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuilder stringBuilder = new StringBuilder();
                String JSON_STRING;
                while ((JSON_STRING = bufferedReader.readLine()) != null) {
                    stringBuilder.append(JSON_STRING+"\n");
                }

                bufferedReader.close();
                inputStream.close();
                httpURLConnection.disconnect();
                return stringBuilder.toString().trim();

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }


            return "";

        }

Die Methode "onPostExecute" aus "BackgroundTask":
Code:
protected void onPostExecute(String result) {
        //super.onPostExecute(aVoid);
        if(suchen == false) {
            if (result.equals("Party eingetragen")) {
                Toast.makeText(ctx, result, Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(ctx, "Datenbank-Fehler beim Eintragen", Toast.LENGTH_LONG).show();
            }
        }
        else //Hier wird der JSON String an "MainActivity/PlaceholderFragment" übergeben, um ihn dort in einer ListView darzustellen
        {
            jString = result;
            activity.setzeString(jString);
        }
    }

Die Klasse "PartyItem":
Code:
public class PartyItem {

    private String partyName;
    private String partyZeit;
    private String partyAdresse;

    public PartyItem(String pName, String pZeit, String pAdresse) {
        this.setPartyName(pName);
        this.setPartyZeit(pZeit);
        this.setPartyAdresse(pAdresse);
    }

    public void setPartyName(String pName) {
        partyName = pName;
    }

    public void setPartyZeit(String pZeit) {
        partyZeit = pZeit;
    }

    public void setPartyAdresse(String pAdresse) {
        partyAdresse = pAdresse;
    }

    public String getPartyName() {
        return partyName;
    }

    public String getPartyZeit() {
        return partyZeit;
    }

    public String getPartyAdresse() {
        return partyAdresse;
    }
}

Die Klasse "PartyAdapter":
Code:
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

/**
* Created by Jan on 06.03.2016.
*/
public class PartyAdapter extends ArrayAdapter{

    List list = new ArrayList();

    public PartyAdapter(Context context, int resource) {
        super(context, resource);
    }

    public void add(PartyItem object) {
        super.add(object);
        list.add(object);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View row;
        row = convertView;
        ItemHolder itemHolder;
        if(row == null) {
            LayoutInflater layoutInflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = layoutInflater.inflate(R.layout.list_item,parent,false);
            itemHolder = new ItemHolder();
            itemHolder.name_tv = (TextView) row.findViewById(R.id.party_name);
            itemHolder.name_tv = (TextView) row.findViewById(R.id.party_adresse);
            itemHolder.name_tv = (TextView) row.findViewById(R.id.party_zeit);
            row.setTag(itemHolder);

        } else {
            itemHolder = (ItemHolder) row.getTag();

        }

        PartyItem partyItem = (PartyItem)this.getItem(position);
        itemHolder.name_tv.setText(partyItem.getPartyName());
        itemHolder.adresse_tv.setText(partyItem.getPartyAdresse());
        itemHolder.zeit_tv.setText(partyItem.getPartyZeit());

        return row;
    }

    static class ItemHolder {
        TextView name_tv, zeit_tv, adresse_tv;
    }

}

Die "list_item.xml" Datei (Layout Datei für ListView Item):
Code:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="2dp" >

    <!-- Wird derzeit nicht verwendet -->
    <ImageView
        android:id="@+id/profile_pic"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:contentDescription="desc"
        android:paddingLeft="10dp"
        android:paddingRight="10dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Party Name"
        android:id="@+id/party_name"
        android:layout_alignTop="@+id/profile_pic"
        android:layout_toRightOf="@+id/profile_pic"
        android:layout_toEndOf="@+id/profile_pic"
        android:layout_marginLeft="25dp"
        android:layout_marginStart="25dp" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Adresse"
        android:id="@+id/party_adresse"
        android:layout_below="@+id/party_zeit"
        android:layout_alignLeft="@+id/party_zeit"
        android:layout_alignStart="@+id/party_zeit" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Datum und Zeit"
        android:id="@+id/party_zeit"
        android:layout_below="@+id/party_name"
        android:layout_alignLeft="@+id/party_name"
        android:layout_alignStart="@+id/party_name" />

    <!-- Wird derzeit nicht verwendet -->
    <ImageView
        android:id="@+id/age_pic"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:contentDescription="desc"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

Der JSON String sieht folgendermaßen aus:
Code:
Error description: object(mysqli_result) #2 (5) {
  ["current_field"]= >
    int(0)["field_count"] =>
    int(12)["lengths"] =>
    NULL["num_rows"] =>
    int(2)["type"] =>
    int(0)
} {
    "server_response": [{
        "id": "3",
        "party_name": "Name",
        "club_name": "Club",
        "veranstalter": "Veranstalter",
        "datum": "Datum",
        "zeit": "Zeit",
        "age": "Age",
        "adresse": "Adresse",
        "stadt": "Stadt",
        "plz": "PLZ",
        "ticketverkauf": "Tickets",
        "zusagen": "5"
    }, {
        "id": "4",
        "party_name": "White by night ",
        "club_name": "Revolution ",
        "veranstalter": "college break ",
        "datum": "heute",
        "zeit": "jetzt ",
        "age": "16",
        "adresse": "illinghauser weg 10b",
        "stadt": "neuss",
        "plz": "41470",
        "ticketverkauf": "bei mir",
        "zusagen": "0"
    }]
}

Fehlerausgabe:
Code:
Error: Parse error on line 1:
Error description: o
^
Expecting 'STRING', 'NUMBER', 'NULL', 'TRUE', 'FALSE', '{', '[', got 'undefined'

Ich hoffe ihr könnt mir weiterhelfen.

Gruß
Jan
 
Der Beispiel JSON String den Du gepostet hast, kommt der wirklich genau so raus?
Valides, gültiges JSON ist das so natürlich nicht, das ganze DB Zeug am Anfang gehört da nicht hin.

Der Teil hier ist DB Kram:
Code:
Error description: object(mysqli_result) #2 (5) {
   ["current_field"] = >
   int(0)["field_count"] =>
     int(12)["lengths"] =>
     NULL["num_rows"] =>
     int(2)["type"] =>
     int(0)
}

Und der Teil hier ist halt valides JSON:
Code:
 {
    "server_response": [{
        "id": "3",
        "party_name": "Name",
        "club_name": "Club",
        "veranstalter": "Veranstalter",
        "datum": "Datum",
        "zeit": "Zeit",
        "age": "Age",
        "adresse": "Adresse",
        "stadt": "Stadt",
        "plz": "PLZ",
        "ticketverkauf": "Tickets",
        "zusagen": "5"
    }, {
        "id": "4",
        "party_name": "White by night ",
        "club_name": "Revolution ",
        "veranstalter": "college break ",
        "datum": "heute",
        "zeit": "jetzt ",
        "age": "16",
        "adresse": "illinghauser weg 10b",
        "stadt": "neuss",
        "plz": "41470",
        "ticketverkauf": "bei mir",
        "zusagen": "0"
    }]
}

Ein gutes Tool zur Überprüfung, ob deine JSON Strings ok sind ist: http://jsonlint.com/
(Den Code hab ich jetzt nicht wirklich angesehen, ist ein wenig unübersichtlich mit den ganzen einzelnen Codestücken, um zu sehen, was wann wo gemacht wird.)
 
reallord schrieb:
Der Beispiel JSON String den Du gepostet hast, kommt der wirklich genau so raus?
Valides, gültiges JSON ist das so natürlich nicht, das ganze DB Zeug am Anfang gehört da nicht hin.

Der Teil hier ist DB Kram:
Code:
Error description: object(mysqli_result) #2 (5) {
   ["current_field"] = >
   int(0)["field_count"] =>
     int(12)["lengths"] =>
     NULL["num_rows"] =>
     int(2)["type"] =>
     int(0)
}

Und der Teil hier ist halt valides JSON:
Code:
 {
    "server_response": [{
        "id": "3",
        "party_name": "Name",
        "club_name": "Club",
        "veranstalter": "Veranstalter",
        "datum": "Datum",
        "zeit": "Zeit",
        "age": "Age",
        "adresse": "Adresse",
        "stadt": "Stadt",
        "plz": "PLZ",
        "ticketverkauf": "Tickets",
        "zusagen": "5"
    }, {
        "id": "4",
        "party_name": "White by night ",
        "club_name": "Revolution ",
        "veranstalter": "college break ",
        "datum": "heute",
        "zeit": "jetzt ",
        "age": "16",
        "adresse": "illinghauser weg 10b",
        "stadt": "neuss",
        "plz": "41470",
        "ticketverkauf": "bei mir",
        "zusagen": "0"
    }]
}

Ein gutes Tool zur Überprüfung, ob deine JSON Strings ok sind ist: http://jsonlint.com/
(Den Code hab ich jetzt nicht wirklich angesehen, ist ein wenig unübersichtlich mit den ganzen einzelnen Codestücken, um zu sehen, was wann wo gemacht wird.)


Ja die Ausgabe kommt genau so rein. Hier ein Bild von JSON Lint:
http://img5.fotos-hochladen.net/uploads/jsonlintz5xla1w8qk.jpg

Und hier mein php Skript, welches die Daten aus der Datenbank ausliest:
PHP:
<?php

$db_name = "..."; //Hier stehen natürlich die richtigen Werte
$mysql_user = "...";
$mysql_pass = "...";
$server_name = "...";

$con = mysqli_connect($server_name, $mysql_user, $mysql_pass, $db_name);

if (!$con) {
    die("connection error: " . mysqli_connect_error());
}

$sql_query = "SELECT * FROM partydaten";

echo "Error description: " . mysqli_error($con);

$result = mysqli_query($con,$sql_query);
var_dump($result);

$response = array();

while($row = mysqli_fetch_array($result))
{
    array_push($response,array("id"=>$row[0],"party_name"=>$row[1],"club_name"=>$row[2],"veranstalter"=>$row[3],"datum"=>$row[4],"zeit"=>$row[5],"age"=>$row[6],"adresse"=>$row[7],"stadt"=>$row[8],"plz"=>$row[9],"ticketverkauf"=>$row[10],"zusagen"=>$row[11]));
}

print mysqli_error();

print json_encode(array("server_response"=>$response));

mysql_close($con);

?>

Gruß
Jan
 
Meiner Meinung nach musst du die Zeile: "var_dump($result);" löschen. Dann sollte es ein valides JSON sein.
 
Okay, von PHP hab ich nicht wirklich nen Plan....
Soweit ich das kurz gegooglet hab, können echo und print beide zur Ausgabe verwendet werden.


Das ist offensichtlich die Generierung des JSON.
Code:
print json_encode(array("server_response"=>$response));

Mir ist jedoch unklar, wozu dieses Statement ist, wird anscheinend immer ausgeführt, egal ob ein error vorliegt oder nicht.
Code:
echo "Error description: " . mysqli_error($con);


Also mit dem Hinweis von Kardroid:
Ich vermute deine Ausgabe setzt sich wie folgt zusammen:

Vom echo: "Error Description: " (mysqli_error ist null/leer, von da kommt nix mehr.)
Vom var_dump:
"object(mysqli_result) #2 (5) {
["current_field"] = >
int(0)["field_count"] =>
int(12)["lengths"] =>
NULL["num_rows"] =>
int(2)["type"] =>
int(0)
}"
Vom print json_encode: halt das valide JSON.

Die drei Befehle hintereinander ergeben dann deine Ausgabe. Also müsstest Du das var_dump wie Kardroid schrieb und das echo rausnehmen.
 
Kardroid schrieb:
Meiner Meinung nach musst du die Zeile: "var_dump($result);" löschen. Dann sollte es ein valides JSON sein.

reallord schrieb:
Also müsstest Du das var_dump wie Kardroid schrieb und das echo rausnehmen.

Ja jetzt ist es valides JSON. Danke!
Hatte in meinem Code (in der App) auch noch nen kleinen Fehler in der while Schleife, welche die Objekte der JSON Ausgabe in die ListView einfügt.
Die Bedingung "while(count < jsonObject.length())" musste zu "while(count <= jsonObject.length())" geändert werden, da ich sonst nie das letzte Objekt der MySQL Datenbank erhalten habe.

Gruß
Jan
 

Ähnliche Themen

A
Antworten
10
Aufrufe
1.006
swa00
swa00
D
  • Data2006
3 4 5
Antworten
84
Aufrufe
3.468
jogimuc
J
Muecke1982
Antworten
8
Aufrufe
1.009
Skyhigh
Skyhigh
Zurück
Oben Unten