JAVA simple.JSONObject cannot be cast to simple.JSONArray

Hi,

ich hatte das Problem bereits im html.de Forum angesprochen, leider bekam ich da bis jetzt keine Antwort. Ich hoffe das ist jetzt nicht weiter problematisch wenn ich das in einem Forum, welches sich auf Java spezialisiert, nochmal frage.

Also es geht darum das ich eine kleine APP schreiben möchte. Diese APP läd von meiner Web-API den JSON Code und soll diesen zu einer ArrayList machen. Ziel ist es, dass ich alle Produkte in einer Liste habe (Produktname + dedizierte Server IP).

Leider bekomme ich folgenden Fehler: java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to org.json.simple.JSONArray

Ich habe bereits das Internet nach Tutorials durchsucht ob ich vielleicht etwas falsch gemacht habe aber im Internet sind die gleichen Lösungsansätze genommen wurden wie ich sie auch schon habe.

Ich hoffe hier kann mir jemand helfen.

Vielen Dank im vorraus!

JAVA Code
Java:
    public ArrayList HandelJsonResponse (String result) {

        try {

            ArrayList list = new ArrayList();

            JSONParser jsonParser = new JSONParser();
            Object obj = jsonParser.parse(result);

            JSONObject jsonObject = (JSONObject) obj;

            JSONArray slideContent = (JSONArray) jsonObject.get("products");
            Iterator i = slideContent.iterator();

            while (i.hasNext()) {
                JSONObject slide = (JSONObject) i.next();
                list.add((String)slide.get("name") +  " - " + (String)slide.get("dedicatedip"));
            }


            return list;
        } catch (ClassCastException e) {
            e.printStackTrace();
            return null;
        } catch (ParseException ex) {
            ex.printStackTrace();
            return null;
        } catch (NullPointerException ex) {
            ex.printStackTrace();
            return null;
        }
    }

JSON Code:
Code:
{
    "@attributes": {
        "version": "6.0.2"
    },
    "action": "getclientsproducts",
    "result": "success",
    "clientid": "36",
    "serviceid": {},
    "pid": {},
    "domain": {},
    "totalresults": "10",
    "startnumber": "0",
    "numreturned": "10",
    "products": {
        "product": [
            {
                "id": "415",
                "clientid": "36",
                "orderid": "463",
                "pid": "54",
                "regdate": "2015-05-28",
                "name": "Testserver",
                "groupname": "Testserver",
                "domain": {},
                "dedicatedip": {},
                "serverid": "6",
                "servername": "Server Yellow",
                "serverip": {},
                "serverhostname": "656.564.564.54",
                "firstpaymentamount": "0.00",
                "recurringamount": "0.00",
                "paymentmethod": "banktransfer",
                "paymentmethodname": "Überweisung",
                "billingcycle": "Free Account",
                "nextduedate": "0000-00-00",
                "status": "Terminated",
                "username": "Demo",
                "password": "asdasda",
                "subscriptionid": {},
                "promoid": "0",
                "overideautosuspend": "0",
                "overidesuspenduntil": "0000-00-00",
                "ns1": {},
                "ns2": {},
                "assignedips": {},
                "notes": {},
                "diskusage": "0",
                "disklimit": "0",
                "bwusage": "0",
                "bwlimit": "0",
                "lastupdate": "0000-00-00 00:00:00",
                "customfields": {
                    "customfield": [
                        {
                            "id": "92",
                            "name": "Standort",
                            "value": "Deutschland - Frankfurt am Main"
                        },
                        {
                            "id": "93",
                            "name": "Arbeitsspeicher",
                            "value": "1 GB"
                        },
                        {
                            "id": "99",
                            "name": "smskey",
                            "value": "reteterr4"
                        }
                    ]
                },
                "configoptions": {
                    "0": "\n"
                }
            },
            {
                "id": "416",
                "clientid": "36",
                "orderid": "464",
                "pid": "53",
                "regdate": "2015-05-28",
                "name": "Testserver M",
                "groupname": "Testserver",
                "domain": "test.de",
                "dedicatedip": "123.456.789.54",
                "serverid": "0",
                "servername": {},
                "serverip": {},
                "serverhostname": {},
                "firstpaymentamount": "0.00",
                "recurringamount": "0.00",
                "paymentmethod": "banktransfer",
                "paymentmethodname": "Überweisung | Bank Transfer",
                "billingcycle": "Free Account",
                "nextduedate": "0000-00-00",
                "status": "Cancelled",
                "username": "ggf-36",
                "password": "sdfsdfasdf",
                "subscriptionid": {},
                "promoid": "0",
                "overideautosuspend": "0",
                "overidesuspenduntil": "0000-00-00",
                "ns1": "test.de",
                "ns2": "test.de",
                "assignedips": {},
                "notes": {},
                "diskusage": "0",
                "disklimit": "0",
                "bwusage": "0",
                "bwlimit": "0",
                "lastupdate": "0000-00-00 00:00:00",
                "customfields": {
                    "customfield": [
                        {
                            "id": "87",
                            "name": "vserverid",
                            "value": "56544"
                        },
                        {
                            "id": "88",
                            "name": "rootpassword",
                            "value": "hhdfghfghdfgh"
                        },
                        {
                            "id": "89",
                            "name": "nodeid",
                            "value": "20"
                        },
                        {
                            "id": "90",
                            "name": "consoleusername",
                            "value": "console-JhjRjN"
                        },
                        {
                            "id": "91",
                            "name": "consolepassword",
                            "value": "sdfsdfasdf"
                        },
                        {
                            "id": "100",
                            "name": "smskey",
                            "value": "8b50cb99a2"
                        }
                    ]
                },
                "configoptions": {
                    "0": "\n"
                }
            }
        ]
    }
}
 
Hallo,

dein JSON-Code sieht komisch aus. products soll doch wohl ein Array von product sein.
Code:
"products": [
   "product": {...},
   "product": {...}
]
 
Hallo,

products ist auch ein JSONObject.
product ist das JSONArray.

Code:
JSONObject products= (JSONObject) jsonObject.get("products");

JSONArray list = (JSONArray) products.get("product");

P.S ich sehe auch nur einmal product.
 
Zuletzt bearbeitet:
Hey,

vielen Dank! Das ganze hat mich schon ein Stück weitergebracht. 🙂

Nun habe ich das ganze mal getestet und bekomme folgenden Fehler: java.lang.ClassCastException: org.json.simple.JSONObject cannot be cast to java.lang.String

Der Fehler entsteht hier:
Java:
list.add(slide.get("name").toString() +  " - " + slide.get("dedicatedip").toString());

Ich habe es sowohl mit (String)slide.get("name"); probiert als auch mit toString() - bei beiden kommt der Fehler.

Im JSONObject slide (Welches in der while-schleife gesetzt wird) sind alle Daten vorhanden. Wo ist also nun das Problem, das Element zu einen String zu casten?
 
Hallo,

mache doch einfach mal getClass() und nicht toString().

Dann siehst du welches Object es ist.
dedicatedip ist ein JSONObject.

Ein Tipp von mir. Schau dir mal an wie ein JSON aufgebaut ist. Google hilft dir dabei sicherlich auch ein wenig.

Die Zeile sollte aber funktionieren. Ich sehe da kein Problem.

Gruß
 
Die Zeile kann keine ClassCastException geben. Da ist ja gar kein ClassCast involviert. (Im toString())

Sonst ist der Debugger dein Freund. ein JSONObject ist ja nur ein Wrapper für eine Hashmap, also sollte das Handling da ja nicht sonderlich schwer sein.
 
Hi,

soweit alles fertig und funktioniert nun auch. Vielen Dank für eure Hilfe!

Nun habe ich die ArrayList und möchte diese in ein ListView eintragen. Dafür habe ich mir eine einfache UpdateTable Funktion gebaut:

Code:
    public void UpdateTable (ArrayList list) {

        ListAdapter adapter = new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, list);
        this.listview.setAdapter(adapter);
    }

Wenn ich die ArrayList an diese Tabelle übergebe sollte eigentlich die Liste mit den Daten gefüllt werden. Ich erhalte aber nur eine weiße Seite!

Wenn ich in die onCreate Funktion vorher ein Array mit meiner UpdateTable Funktoion lade funktioniert das.

Code:
    String[] example = new String[] { "Test", "Test2", "Test3", "Test4"};

    ArrayList<String> list = new ArrayList<String>();
    for (int i = 0; i < example.length; ++i) {
      list.add(example[i]);
    }

UpdateTable(list);

Sobald ich aber die Daten aus meiner API verwenden möchte hängt Sie sich APP auf, glaube ich. Abstürzen tut sie nicht aber es ist einfach eine weiße Seite da. Wenn vorher Daten in der ListView waren kann ich diese Elemente ab dann nicht mehr anklicken.
Ich habe auch gedebuggt. Es kommt kein aber garkein Fehler! Das Array welches aus dem JSON teil besteht ist auch gefüllt und eigentlich sollte es funktionieren. ^__^

list -> [0] = "Server 1", [1] = "Server 2" usw.

Habt Ihr da nochmal eine Idee?

Code:
public class products extends AppCompatActivity {
    private ListView listview;
    private ProgressDialog progressDialog;
    private String androidid;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_products);

        this.androidid = new Config().devideid(this.getContentResolver());
        this.listview = (ListView) findViewById(R.id.listView);

        new Waiter().execute();

    }

    public void UpdateTable (ArrayList list) {

        ListAdapter adapter = new ArrayAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, list);
        this.listview.setAdapter(adapter);
    }

    private class Waiter extends AsyncTask {
        //Before running code in separate thread
        @Override
        protected void onPreExecute()
        {
            progressDialog = ProgressDialog.show(products.this, "Laden...","Bitte warten Sie, wärend Ihre Daten geladen werden.", false, false);

        }

        protected void onPostExecute(Void result)
        {
            //close the progress dialog
            if(progressDialog.isShowing())progressDialog.dismiss();
            setContentView(R.layout.activity_main);
        }

        @Override
        protected ArrayList doInBackground(Object... arg0) {
            Products products = new Products();

            ArrayList<String> plist = products.getProducts(androidid);

            try {
                UpdateTable(plist);
                progressDialog.dismiss();
                return plist;
            } catch (Exception e) {

                e.fillInStackTrace();
                e.getMessage();

            } catch(Throwable e) {
                e.getMessage();
            }
            progressDialog.dismiss();
            return null;
        }

    }
 
Hallo,

also erstmal würde ich UpdateTable nicht in doInBackground packen sondern in
onPostExecute und du verwendest AsyncTask nicht so wie es gedacht ist.

Java:
class MyTask extends AsyncTask<String, Void, Long> {
  
    // Deine Konstruktoren ...
  
    protected Long doInBackground(String... args) {
        List<String> list ...
        return list;
    }

    protected void onPostExecute(List<String> result) {
        // mach was mit dem Ergebnis
    }
}

new MyTask().execute("json");

Und warum machst du setContentView(R.layout.activity_main); ?
Du hast doch schon setContentView(R.layout.activity_products); gesetzt?

Grüße
 
Hi,

ich hatte onPostExecute nicht weiter benutzt, da es bei mir nicht aufgerufen wurde.
Hab den Code jetzt nochmal entsprechend überarbeitet aber das Problem ist halt das onPostExecute nicht ausgeführt wird.

Java:
    private class LoaderTask extends AsyncTask<String, Void, ArrayList> {

        @Override
        protected ArrayList doInBackground(String... args) {
            Products products = new Products();

            ArrayList<String> plist = products.getProducts(androidid);

            return plist;
        }

        @Override
        protected void onPreExecute()
        {
            progressDialog = ProgressDialog.show(products.this, "Laden...","Bitte warten Sie, wärend Ihre Daten geladen werden.", false, false);

        }

        protected void onPostExecute(ArrayList<String> result)
        {

            UpdateTable(result);
            if(progressDialog.isShowing())progressDialog.dismiss();

        }



    }
 

Zurück
Oben