Json Array lässt sich nicht parsen

  • Antworten:3
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 39

02.09.2019, 14:54:53 via Website

Hey,
Ich versuche in folgender Methode eine Tabelle aus einem Json Objekt zu erstellen. Jedoch wirft mir das ganze einen "Not a primitive array" Fehler auf. Könntet ihr mir helfen meinen Fehler zu finden?
Hier mein Code:

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public void tableInit() throws JSONException {
    Log.e("TableInit()", "Start!");
    Log.e("TableInit()", ""+jsonObjectToTable);
    JSONArray jsonArray = new JSONArray(jsonObjectToTable);
    float textSize = 18.0f;
    TableLayout stk = (TableLayout) findViewById(R.id.table_main);
    TableRow tbrow0 = new TableRow(this);

    TextView tv0 = new TextView(this);
    tv0.setText(" ID ");
    tv0.setTypeface(null, Typeface.BOLD); //fett
    tv0.setTextSize(textSize);
    tbrow0.addView(tv0);

    TextView tv1 = new TextView(this);
    tv1.setText(" NAME ");
    tv1.setTypeface(null, Typeface.BOLD); //fett
    tv1.setTextSize(textSize);
    tbrow0.addView(tv1);

    TextView tv2 = new TextView(this);
    tv2.setText(" HOME ");
    tv2.setTypeface(null, Typeface.BOLD); //fett
    tv2.setTextSize(textSize);
    tbrow0.addView(tv2);

    TextView tv3 = new TextView(this);
    tv3.setText(" WETSUIT ");
    tv3.setTypeface(null, Typeface.BOLD); //fett
    tv3.setTextSize(textSize);
    tbrow0.addView(tv3);

    TextView tv4 = new TextView(this);
    tv4.setText(" BOARD ");
    tv4.setTypeface(null, Typeface.BOLD); //fett
    tv4.setTextSize(textSize);
    tbrow0.addView(tv4);

    TextView tv5 = new TextView(this);
    tv5.setText(" RIG ");
    tv5.setTypeface(null, Typeface.BOLD); //fett
    tv5.setTextSize(textSize);
    tbrow0.addView(tv5);

    TextView tv6 = new TextView(this);
    tv6.setText(" HARNESS ");
    tv6.setTypeface(null, Typeface.BOLD); //fett
    tv6.setTextSize(textSize);
    tbrow0.addView(tv6);

    TextView tv7 = new TextView(this);
    tv7.setText(" RENTING_DATE ");
    tv7.setTypeface(null, Typeface.BOLD); //fett
    tv7.setTextSize(textSize);
    tbrow0.addView(tv7);

    TextView tv8 = new TextView(this);
    tv8.setText(" RENT_UNTIL ");
    tv8.setTypeface(null, Typeface.BOLD); //fett
    tv8.setTextSize(textSize);
    tbrow0.addView(tv8);


    stk.addView(tbrow0);


    for(int i = 0; i < jsonArray.length(); ++i)
    {
        // Extract values from JSON row:
        JSONObject jsonObject      = jsonArray.getJSONObject(i);
        Log.e("JsonObject", ""+jsonObject);
        String     id     = jsonObject.has("id")     ? jsonObject.getString("id") : "";
        String     name    = jsonObject.has("name")    ? jsonObject.getString("name") : "";
        String     home = jsonObject.has("home") ? jsonObject.getString("home") : "";
        String     wetsuit     = jsonObject.has("wetsuit")     ? jsonObject.getString("wetsuit") : "";
        String     board     = jsonObject.has("board")     ? jsonObject.getString("board") : "";
        String     rig     = jsonObject.has("rig")     ? jsonObject.getString("rig") : "";
        String     harness     = jsonObject.has("harness")     ? jsonObject.getString("harness") : "";
        String     rent_until     = jsonObject.has("rent_until")     ? jsonObject.getString("rent_until") : "";
        String     renting_date     = jsonObject.has("renting_date")     ? jsonObject.getString("renting_date") : "";



        TableRow tbrow = new TableRow(this);

        TextView textViewId = new TextView(this);
        textViewId.setText(id);
        textViewId.setGravity(Gravity.CENTER);
        tbrow.addView(textViewId);

        TextView textViewName = new TextView(this);
        textViewName.setText(name);
        textViewName.setGravity(Gravity.CENTER);
        tbrow.addView(textViewName);

        TextView textViewHome= new TextView(this);
        textViewHome.setText(home);
        textViewHome.setGravity(Gravity.CENTER);
        tbrow.addView(textViewHome);

        TextView textViewWetsuit= new TextView(this);
        textViewWetsuit.setText(wetsuit);
        textViewWetsuit.setGravity(Gravity.CENTER);
        tbrow.addView(textViewWetsuit);

        TextView textViewBoard = new TextView(this);
        textViewBoard.setText(board);
        textViewBoard.setGravity(Gravity.CENTER);
        tbrow.addView(textViewBoard);

        TextView textViewRig = new TextView(this);
        textViewRig.setText(rig);
        textViewRig.setGravity(Gravity.CENTER);
        tbrow.addView(textViewRig);

        TextView textViewHarness = new TextView(this);
        textViewHarness.setText(harness);
        textViewHarness.setGravity(Gravity.CENTER);
        tbrow.addView(textViewHarness);

        TextView textViewRentUntil = new TextView(this);
        textViewRentUntil.setText(rent_until);
        textViewRentUntil.setGravity(Gravity.CENTER);
        tbrow.addView(textViewRentUntil);

        TextView textViewRentingDate = new TextView(this);
        textViewRentingDate.setText(renting_date);
        textViewRentingDate.setGravity(Gravity.CENTER);
        tbrow.addView(textViewRentingDate);

        TextView t4v = new TextView(this);
        t4v.setText(board);
        t4v.setGravity(Gravity.CENTER);
        tbrow.addView(t4v);
        stk.addView(tbrow);
    }

}

Und hier der Fehler:

E/TableInit(): Start!
E/TableInit(): {"equipment_private":[{"id":"1","name":"Name","home":"Unterkunft","wetsuit":"Anzug","board":"Board","rig":"Segel","harness":"Trapetz","renting_date":"23.01.19","rent_until":"23.12.19"},{"id":"2","name":"Name","home":"Unterkunft","wetsuit":"Anzug","board":"Board","rig":"Segel","harness":"Trapetz2","renting_date":"","rent_until":""}]}
W/System.err: org.json.JSONException: Not a primitive array: class org.json.JSONObject
    at org.json.JSONArray.<init>(JSONArray.java:116)
    at com.example.surftest.MainActivity.tableInit(MainActivity.java:90)
    at com.example.surftest.MainActivity$RequestSelectAsync.onPostExecute(MainActivity.java:249)
    at com.example.surftest.MainActivity$RequestSelectAsync.onPostExecute(MainActivity.java:228)
    at android.os.AsyncTask.finish(AsyncTask.java:695)
    at android.os.AsyncTask.access$600(AsyncTask.java:180)
    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:712)
    at android.os.Handler.dispatchMessage(Handler.java:106)
W/System.err:     at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Der Fehler verweist auf Die Zeile Fünf in dem hier geposteten code ( Im Fehler code "MainActivity.java:90)").

Liebe Grüße und Danke im Vorraus.
Slarti :)

— geändert am 02.09.2019, 15:03:43 durch Moderator

Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.548

02.09.2019, 15:10:18 via Website

Wenn du ein JsonArray mit einem String initialisiert, müssen die Werte "primitive" sein also String,int etc.
Du hast aber ein Array mit JsonObjects.
Also musst du erst ein JsonObject initialisieren (den kompletten parser) und dann das Array als Element rausziehen und/oder casten:

JSONObject jsonObject = new JSONObject(jsonString);

Ich würde dir allerdings die Google Gson Lib empfehlen, da kannst du dir ein Java Objekt anlegen, das die passende Struktur hat und dann den String mit 2 Zeilen direkt in eine List schreiben.
Dann sparst du dir diese ganze manuelle parsergeschichte und kannst flexibel mit dem Objekt arbeiten.

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!
  • Forum-Beiträge: 39

02.09.2019, 15:30:30 via Website

Danke für die schnelle Antwort.
Ich habe schon vorher ein Json Object initialisiert.
Das Passiert in folgender Methode:

JsonObject jsonObjectToTable = new JsonObject;

public class RequestSelectAsync extends AsyncTask<String,String,String> {
    @Override
    protected String doInBackground(String... strings) {
        Log.e("Async", "Async starts!");
        JSONObject postDataParams = new JSONObject();
        try {
            response = RequestHandler.sendGet("http://192.168.122.1/php/renting_private_select.php");
            return response;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    @Override
    protected void onPostExecute(String s) {
        try {
            JSONObject tableJson = new JSONObject(s);
            jsonObjectToTable = tableJson;
            tableInit();
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}

Die Gson Lib schau ich mir mal an. Ich würde trozdem gerne verstehen, wo bei mir der Fahler lag :)

Hilfreich?
Diskutiere mit!
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.548

02.09.2019, 17:53:49 via Website

Der Fehler ist das das JsonArray nicht diekt anfängt sondern via Key "equipment_private" errecihbar ist.

Also musst du dein Object so auch lesen:

 JSONArray jsonArray = jsonObjectToTable.getJSONArray("equipment_private");

LG Pascal //It's not a bug, it's a feature. :) ;)

Hilfreich?
Diskutiere mit!