JSON einlesen und benutzen

setelk

Mitglied
Morgen,

hab ein kleines Problem und habe mir schon etliche Tutorials angeguckt angeguckt, aber leider kommt nur bei mir der Fehler.

Ich möchte bestimmte Werte von der json einlesen und dann weiter verarbeiten.
Es soll quasi eine Art Wecker werden, jedoch kann man die Werte auch aus der json lesen statt neu zu schreiben.
Das lesen klappt einfach nicht. Hab glaube ein enormen Denkfehler.
Egal welches Tut ich mir angucke.
Danke im Voraus und schönen Start in die Woche

JSON:
Code:
[
    {
        "ankunftszeit": "8:00",
        "fahrtweg": "30.0",
        "zeitReady": "40.0"
        "zeitBus": "10.0"
        "mehrZeit": "10.0"
    }
]

Und hier der Code:
Code:
        } else if (option == 1) {
            JSONParser parser = new JSONParser();
            String fileName = "file.json";
            try {
                Object obj = parser.parse(new FileReader(fileName));
                JSONObject jsonObject = (JSONObject) obj;
                ankunftszeit = (String) jsonObject.get("ankunftszeit");
                System.out.println(ankunftszeit);
              
                fahrtweg = (float) jsonObject.get("fahrtweg");
                System.out.println(fahrtweg);

            }
            catch (FileNotFoundException e) { e.printStackTrace();}
            catch (IOException e) { e.printStackTrace();}
            catch (Exception e) { e.printStackTrace();}

        }
        in.close();
Und die Fehlermeldung:
Code:
java.lang.ClassCastException: class org.json.simple.JSONArray cannot be cast to class org.json.simple.JSONObject (org.json.simple.JSONArray and org.json.simple.JSONObject are in unnamed module of loader 'app')
Fehler in Zeile 80 -> JSONObject jsonObject = (JSONObject) obj;
 
Dein JSON-Code beginnt mit eckigen Klammern und hat erst dann geschweifte Klammern.
Es enthält also ein Array von Objekten.
Du tust so, als enthielte es nur ein Objekt.
 
Dein JSON-Code beginnt mit eckigen Klammern und hat erst dann geschweifte Klammern.
Es enthält also ein Array von Objekten.
Du tust so, als enthielte es nur ein Objekt.
Wenn ich also die eckige Klammer weg mache, ist es nur ein Objekt?

Edit: Klammer wegemacht und jetzt lässt sich das auslesen.
Ist es aber auch praktikabel es ohne array zu machen=?
 
Woher kommt denn das JSON? Wenn das JSON eben genau so kommt, wie es angezeigt wurde, dann solltest Du es auch eben genau so einlesen.

Und wenn Du es manuell machst, dann ist halt das erste Objekt ein JSONArray dessen erstes Element Du dann nehmen kannst (Statt den Text des JSON irgendwie anzupassen).

Generell wäre es aber evtl. auch einfach ratsam, eine Library zu nutzen, die gleich das ganze Decoding macht. Dann hast Du eine Datenklasse und sagst dann nur noch, dass Du eine ArrayList von dieser Datenklasse eingelesen haben willst.
 
Wie das Einlesen eines solchen JSON aussehen kann mit GSON kannst Du hier erkennen:

Code:
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import org.junit.jupiter.api.Test;

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

import static org.junit.jupiter.api.Assertions.assertEquals;

public class WeckerJasonTests {

    public static class Wecker {
        private String ankunftszeit;
        private String fahrtweg;
        private String zeitReady;
        private String zeitBus;
        private String mehrZeit;
    }

    private static final String JSONText = "[\n" +
            "  {\n" +
            "    \"ankunftszeit\": \"8:00\",\n" +
            "    \"fahrtweg\": \"30.0\",\n" +
            "    \"zeitReady\": \"40.0\",\n" +
            "    \"zeitBus\": \"10.0\",\n" +
            "    \"mehrZeit\": \"10.0\"\n" +
            "  }\n" +
            "]";

    @Test
    public void testDecode() {
        Gson gson = new Gson();
        TypeToken<ArrayList<Wecker>> typeToken = new TypeToken<>(){};
        List<Wecker> importedData = gson.fromJson(JSONText, typeToken.getType());
        assertEquals(1, importedData.size());
    }
}

Das Einlesen sind nur die Zeilen 32-34, der Rest ist halt nur das Drumherum:
  • Die Klasse für die Daten
  • Das JSON als String (und auch verbessert, bei Dir fehlten Kommata!)
 

Zurück
Oben