Brett vorm Kopf: Aus JSON-Datei Objekte (JSONArray) lesen

  • Antworten:2
Gerd-Ulrich M.
  • Forum-Beiträge: 770

04.05.2016, 07:13:15 via Website

Hallo,

aus einer vorher geschriebenen JSON-Datei möchte ich die darin gespeicherten Objekte wieder lesen. Ein solches Objekt sieht (abgesehen von den Getter- und Setter-Methoden) so aus:

public class cDevice {
    public cDevice(int deviceTypeSelector, String cubeCubeName, String cubeCubeRFAddress, String cubeCubeSerialNumber, String raumName, int raumNameLaenge, byte raumID, String raumRFAdresse, String deviceRFAddress, int deviceType, String deviceName, String deviceSeriennummer, int deviceRoomID) {
        DeviceTypeSelector = deviceTypeSelector;
        CubeCubeName = cubeCubeName;
        CubeCubeRFAddress = cubeCubeRFAddress;
        CubeCubeSerialNumber = cubeCubeSerialNumber;
        RaumName = raumName;
        RaumNameLaenge = raumNameLaenge;
        RaumID = raumID;
        RaumRFAdresse = raumRFAdresse;
        DeviceRFAddress = deviceRFAddress;
        DeviceType = deviceType;
        DeviceName = deviceName;
        DeviceSeriennummer = deviceSeriennummer;
        DeviceRoomID = deviceRoomID;
    }

Hinweis: Doppelt/ähnlich aussehende Properties sind Absicht und im Moment auch nicht das Problem

Die Arraylist, wo die gelesenen Objekte wieder rein müssen, sieht so aus:

ArrayList<cDevice> CubeNetz = new ArrayList();

In die JSON-Datei geschrieben wird das ganze über:

// Jetzt das ganze speichern (als JSONArray)
            JSONArray CubeNetzwerk = new JSONArray();
            for (int DevicesCounter = 0; DevicesCounter < CubeNetz.size(); DevicesCounter++) {
                cDevice AktDevice = new cDevice(0,"","","","",0,Byte.decode("0"),"","",0,"","",0);
                AktDevice = CubeNetz.get(DevicesCounter);
                CubeNetzwerk.put(AktDevice.DeviceToJson());
            }
            FileWriter JsonDatei = new FileWriter(VerwaltungXmlDatei);
            JsonDatei.write(CubeNetzwerk.toString());
            JsonDatei.flush();

Die Methode AktDevice.DeviceToJson()sieht so aus:

public JSONObject DeviceToJson() {
        JSONObject devobj = new JSONObject();
        try {
            devobj.put("DeviceTypeSelector",DeviceTypeSelector);
            devobj.put("CubeCubeName",CubeCubeName);
            devobj.put("CubeCubeRFAddress",CubeCubeRFAddress);
            devobj.put("CubeCubeSerialNumber",CubeCubeSerialNumber);
            devobj.put("RaumName",RaumName);
            devobj.put("RaumNameLaenge",RaumNameLaenge);
            devobj.put("RaumID",RaumID);
            devobj.put("RaumRFAdresse",RaumRFAdresse);
            devobj.put("DeviceRFAddress",DeviceRFAddress);
            devobj.put("DeviceType",DeviceType);
            devobj.put("DeviceName",DeviceName);
            devobj.put("DeviceSeriennummer",DeviceSeriennummer);
            devobj.put("DeviceRoomID",DeviceRoomID);

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

Hinweise: Die dazugehörigen Exceptions werden abgefangen (hier aber für's Problem nicht wichtig)
Das die Datei noch VerwaltungXmlDatei heißt, ist nicht entscheidend, da sie nicht als XML-gespeichert oder interpretiert wird

Zum Lesen hab ich bisher dies hier:
(in der class cDevice(testweise erstmal nur ein einziges Element))

 public cDevice JsonToDevice(JSONObject DeviceAsJson) {
        cDevice dev = new cDevice(0,"","","","",0,Byte.decode("0"),"","",0,"","",0);
        try {
            dev.setDeviceTypeSelector(DeviceAsJson.getInt("DeviceTypeSelector"));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return dev;
    }

Und da wo wirklich gelesen wird:

 public void readDevicesListFromJson(File VerwaltungXmlDatei) {
        String JSonZeile = new String();
        FileReader frjson = null;
        try {
            frjson = new FileReader(VerwaltungXmlDatei);
            BufferedReader br = new BufferedReader(frjson);
            String jsonZeile = "";
            while ((jsonZeile = br.readLine()) != null) {
                JSONArray ja = new JSONArray(jsonZeile);
                for (int i = 0; i < ja.length(); i++) {
                    cDevice jo = (cDevice) ja.get(i);
                    CubeNetz.add(jo.JsonToDevice());   // <<== Wie geht's hier weiter???
                }
            }

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


    }

Mein Problem (und damit die Stelle, wo ich das Brett vorm Kopf hab) ist die markierte Zeile. Geh ich da falsch vor? oder wie muss das angepasst werden, damit's funktioniert?

Da vor ein paar Tagen auf eine ähnliche Frage von mir der Hinweis auf Gson gekommen ist - bitte nicht vorschlagen. Ich möchte es mit den direkten JSON-Klassen lösen - das muss gehen.

Vielen Dank schon mal und Gruss
G.-U.M.

PS: Für den Fall, dass es wichtig ist, hier noch die erzeugte JSON-Datei (ist nicht soo lang):

[{"RaumName":"","DeviceTypeSelector":0,"RaumNameLaenge":0,"DeviceName":"","DeviceRFAddress":"","RaumID":0,"CubeCubeRFAddress":"0cd86d","DeviceRoomID":0,"CubeCubeName":"","CubeCubeSerialNumber":"EQ0837268","DeviceSeriennummer":"","DeviceType":0,"RaumRFAdresse":""},{"RaumName":"Wohnzimmer","DeviceTypeSelector":1,"RaumNameLaenge":10,"DeviceName":"","DeviceRFAddress":"","RaumID":1,"CubeCubeRFAddress":"","DeviceRoomID":0,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"","DeviceType":0,"RaumRFAdresse":"\u000bqᆭ"},{"RaumName":"Schlafzimmer","DeviceTypeSelector":1,"RaumNameLaenge":12,"DeviceName":"","DeviceRFAddress":"","RaumID":2,"CubeCubeRFAddress":"","DeviceRoomID":0,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"","DeviceType":0,"RaumRFAdresse":"\u000bニ@"},{"RaumName":"Bᅢᄐro","DeviceTypeSelector":1,"RaumNameLaenge":5,"DeviceName":"","DeviceRFAddress":"","RaumID":3,"CubeCubeRFAddress":"","DeviceRoomID":0,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"","DeviceType":0,"RaumRFAdresse":"\u000bq￘"},{"RaumName":"Badezimmer","DeviceTypeSelector":1,"RaumNameLaenge":10,"DeviceName":"","DeviceRFAddress":"","RaumID":4,"CubeCubeRFAddress":"","DeviceRoomID":0,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"","DeviceType":0,"RaumRFAdresse":"\u000bメ\u000b"},{"RaumName":"Gᅢᄂstezimmer","DeviceTypeSelector":1,"RaumNameLaenge":12,"DeviceName":"","DeviceRFAddress":"","RaumID":5,"CubeCubeRFAddress":"","DeviceRoomID":0,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"","DeviceType":0,"RaumRFAdresse":"\u000b`\/"},{"RaumName":"","DeviceTypeSelector":2,"RaumNameLaenge":0,"DeviceName":"Schlafen","DeviceRFAddress":"\u000bニ@","RaumID":0,"CubeCubeRFAddress":"","DeviceRoomID":2,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"KEQ0446747","DeviceType":1,"RaumRFAdresse":""},{"RaumName":"","DeviceTypeSelector":2,"RaumNameLaenge":0,"DeviceName":"Bᅢᄐro","DeviceRFAddress":"\u000bq￘","RaumID":0,"CubeCubeRFAddress":"","DeviceRoomID":3,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"KEQ0449549","DeviceType":1,"RaumRFAdresse":""},{"RaumName":"","DeviceTypeSelector":2,"RaumNameLaenge":0,"DeviceName":"Bad","DeviceRFAddress":"\u000bメ\u000b","RaumID":0,"CubeCubeRFAddress":"","DeviceRoomID":4,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"KEQ0446180","DeviceType":1,"RaumRFAdresse":""},{"RaumName":"","DeviceTypeSelector":2,"RaumNameLaenge":0,"DeviceName":"Wohnzimmer","DeviceRFAddress":"\u000bqᆭ","RaumID":0,"CubeCubeRFAddress":"","DeviceRoomID":1,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"KEQ0449570","DeviceType":1,"RaumRFAdresse":""},{"RaumName":"","DeviceTypeSelector":2,"RaumNameLaenge":0,"DeviceName":"Gᅢᄂstezimmer","DeviceRFAddress":"\u000b`\/","RaumID":0,"CubeCubeRFAddress":"","DeviceRoomID":5,"CubeCubeName":"","CubeCubeSerialNumber":"","DeviceSeriennummer":"KEQ0450567","DeviceType":1,"RaumRFAdresse":""}]

N'y pas n'y
tu car tu
mal tu mal

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

04.05.2016, 08:48:55 via App

Du musst das gante json erstmal einlesen so dass du in einem Steing die Datei komplett hast.
Dann kannst du durchs JsonArray Interieren und mit get(i) den Wert auslesen (evntl mit Typ also getString(i) etc..
Somit musst du iterieren dann alle weete auslesen und dann mit diesen werten deine Kasse Inszanzieren.
Aber warum castest du das JsonObject zu einem cDevice?
Das kann doch garnicht gehen außer du hast den Cast als implizit Operator programmiert.

Also jeden wert einzeln auselsen und dann Instanz machen.
Oder du gibst deiner Kase noch einen 2. Konstruktor mit Parameter JsonArray/JsonObject und liest es dann daraus.

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

Antworten
Gerd-Ulrich M.
  • Forum-Beiträge: 770

04.05.2016, 09:43:41 via Website

Pascal P.

Du musst das gante json erstmal einlesen so dass du in einem Steing die Datei komplett hast.

Ok, das kriege ich hin.

Dann kannst du durchs JsonArray Interieren und mit get(i) den Wert auslesen (evntl mit Typ also getString(i) etc..
Somit musst du iterieren dann alle weete auslesen und dann mit diesen werten deine Kasse Inszanzieren.

Also brauch ich meine Konvertierung von JsonObject in mein cDevice überhaupt nicht.

Aber warum castest du das JsonObject zu einem cDevice?

Weil ich dachte, das geht so :?

Das kann doch garnicht gehen außer du hast den Cast als implizit Operator programmiert.

Ok, das ist die Erklärung, warum es nicht geht ;)

Also jeden wert einzeln auselsen und dann Instanz machen.

Na gut, dass muss ich mir angucken und ausprobieren.

Oder du gibst deiner Kase noch einen 2. Konstruktor mit Parameter JsonArray/JsonObject und liest es dann daraus.

Hmmm....ich glaub, ich probier erstmal so weiter - du hast mir ja erklärt, wie's geht. Sonst meld ich mich sicherlich nochmal....das Projekt ist noch lange nicht vorbei und ich lern bei jedem kleinen Teil davon weiter).
Danke und Gruss
G.-U.M.

N'y pas n'y
tu car tu
mal tu mal

Antworten