Read JSON File Problem

doktordoom

Mitglied
Hallo,
ich versuche aktuell mittels GSON *.json Files zu schreiben und zu lesen. Das Schreiben hat schon funktioniert.
Das test.json File findet Ihr unten. Das Lesen macht mir aktuell ein paar Probleme. Bei dem Parsen/Lesen in ein JSON Element oder Object lande ich immer in einer Exception. Das test.json file habe ich erfolgreich validieren lassen durch eine Website. Am Ende würde ich am Anfang erst einmal Node.Name parsen und in ein Liste speichern können.

Code:
public static List<String> getNodes( java.io.File f) throws FileNotFoundException
    {
        List<String> SearchList = new ArrayList<>();

                
        try {
           // Gson gson = new Gson();
            // Creates a FileWriter
            FileReader file = new FileReader(f.getPath());

            // Creates a BufferedWriter
            BufferedReader input = new BufferedReader(file);
            
            
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = input.readLine()) != null) {
              sb.append(line);
            }
            String json = sb.toString();
            System.out.println(json);
            
            JsonElement jsonElement = (JsonElement) new JSONParser().parse(json);
            JsonObject jsonObject = jsonElement.getAsJsonObject();
            
            //    JsonObject JsonObejct = new Gson().fromJson(json, JsonObject.class);
            jsonObject = jsonObject.getAsJsonObject("Node.Name");
            
          //  ArrayList arrName = new Gson().fromJson(JsonArray, ArrayList.class);

            
            //ArrayList  jsonObjList = gson.fromJson(input, ArrayList.class);

            // print user object
            System.out.println(jsonObject);
            
            
            // Closes the writer
            input.close();
          }

          catch (Exception e) {
            e.getStackTrace();
          }
        return SearchList;
    }





Java:
[{"Node0":"Properties[ Node.Name = Papier, Node.Visible = false ]","Node1":"Properties[ Node.Name = Qualität, Node.Visible = false ]","Node2":"Properties[ Node.Name = Layout, Node.Visible = false ]"}]
 

KonradN

Super-Moderator
Mitarbeiter
Das Problem dürfte wohl sein, dass Du ein Array hast und du das als ein Objekt ansprechen willst. Aber Du musst da halt erst das Array durchgehen.

Also erst ein getAsJsonArray machen um dann zu dem ersten Node zu gehen.

Und generell ist die Frage: Gson bietet halt super das lesen / schreiben in /von den Entity Klassen. Statt da also die Struktur selbst durchzugehen, sollte man sich eine entsprechende Entity Klasse bauen und dann kannst Du das direkt einlesen. Wobei das JSON schon seltsam aussieht - Du hast gesagt, dass Du es selbst erzeugt hast, daher: Wieso hast Du es so erzeugt und nicht einfach etwas wie

JSON:
[
    {
        "Name": "Papier",
        "Visible": "false"
    },
    {
        "Name": "Qualität",
        "Visible": "false"
    },
    ...
]
 

doktordoom

Mitglied
Hi,
ich habe eben nochmal nachgesehen. Oft sieht man den Wald vor lauter Bäumen nicht. Danke für die tipps. Über die Struktur habe ich gestern Abend auch nach gedacht.
 

KonradN

Super-Moderator
Mitarbeiter
Es ist schön, eine Rückmeldung zu bekommen, aber ich habe jetzt keine Ahnung wo Du nun stehst und was Du aus den Aussagen gemacht hast.

Daher einfach einmal ganz kurz auf die Schnelle etwas gebaut:
Java:
public class Node {
    @SerializedName("Name")
    private String name;
    @SerializedName("Visible")
    private boolean visible;
    
    // Konstruktoren, Getter / Setter und für den Test: equals / hashcode
    // Kann ja von der IDE erzeugt werden!
}

Da sieht dann eine Serialisierung / Deserialisierung so aus:
Java:
public class NodeTest {
    @Test
    public void testSerialization() {
        Node[] nodes = new Node[] {
                new Node("Papier", false),
                new Node("Qualität", false)
        };

        Gson gson = new Gson();

        String json = gson.toJson(nodes);
        System.out.println(json);

        // Zurück in ein Array
        Node[] nodes2 = gson.fromJson(json, Node[].class);

        // Oder in eine Liste
        List<Node> nodesList = gson.fromJson(json, new TypeToken<List<Node>>(){}.getType());

        // Liste kann man natürlich auch serialisieren
        String json2 = gson.toJson(nodesList);
        System.out.println(json2);

        assertTrue(Arrays.equals(nodes, nodes2));
        assertEquals(json, json2);
    }
}

Das ist also wirklich extrem einfach!

Diese @SerializedName(...) sind nur notwendig, wenn Du halt eine ganz exakte Schreibweise willst und diese nicht mit den Namen überein stimmt. Also ohne das, wäre das ein "name" und mit der Annotation eben "Name".

Ansonsten ist es immer die Erstellung einer Gson Instanz. (Wenn man spezielle Serialisierungen hätte, dann könnte man die da auch noch setzen.)

Und dann sind das einfache toJson und fromJson Aufrufe. Dabei ist es egal, ob Array oder List - das geht beides. Bei List muss man dann nur mit einem TypeToken arbeiten.

Man kann da auch noch deutlich mehr mit machen ... ich habe z.B. in JAdventure einmal aufgezeigt, wie man da auch abgeleitete Klassen serialisieren kann. Für so einfache Dinge brauchst Du das aber absolut nicht - aber da sieht man dann z.B. paar Annotations und wie man so Adapter schreiben kann: https://jadventure.de/Anhang/E1-gson/ (Oder in der Lektion 2 mal lesen ... Videos sind noch hoffen - hoffe ich am Sonntag endlich dazu zu kommen, so dass Lektion 2 auch endlich abgeschlossen ist :) )
 

doktordoom

Mitglied
Hi @KonradN,
mein Problem war das ich GSON und simple json in die Maven gepackt habe. Dadurch bin ich bei der Syntax durcheinander gekommen.
Also "JSONArray" & "JsonArray" haben zu einer exception geführt. Aktuell habe die Syntaxt der Json Datei in einem String. Das ist aber nicht mein Ziel. Ich würde gerne durch ein Schlüsselwort oder KeyValue, auf mein Ziel Value wie z.B. Papier zugreifen. Also wie bei einem Dictonary in Pyton oder einfach einer Delegation. Was eigentlich auch der Parser machen sollte. Aber aktuell funktioniert das noch nicht.
 

KonradN

Super-Moderator
Mitarbeiter
Key/Value wäre ja Map und die lässt sich ebenso serialisieren.
Beispiel von SO:

Also wichtig: man braucht kein Adapter oder so!
 

doktordoom

Mitglied
Hi @KonradN,
ich habe dein Vorschlag ausprobiert bekomme aber mit vielen ausprobieren immer die selbe Exception.

"com.google.gson.JsonParseException: The JsonDeserializer MapTypeAdapter failed to deserialize json object [{"{Name0":"Papier,Visible :false}","{Name1":"Qualität,Visible :false}","{Name2":"Layout,Visible :false}"}] given the type java.util.Map<java.lang.String, java.lang.String>"




Java:
public static List<String> getNodes(java.io.File f) throws FileNotFoundException
    {
        List<String> SearchList = new ArrayList<>();
        Gson gson = new Gson();
                
        try {

            // Creates a FileWriter
            FileReader file = new FileReader(f.getPath());

            // Creates a BufferedWriter
            BufferedReader input = new BufferedReader(file);
            
            
            StringBuilder sb = new StringBuilder();
            String line;
            while ((line = input.readLine()) != null) {
              sb.append(line);
            }
            String json = sb.toString();

            java.lang.reflect.Type type2 = new TypeToken<Map<String, String>>(){}.getType();
            Map<String, String> myMap = gson.fromJson(json, type2);
            
                    
            System.out.println(myMap.get("Name0"));
      
            
            // Closes the writer
            input.close();
          }

          catch (Exception e) {
            e.getStackTrace();
            System.out.println(e);
          }
        return SearchList;
    }
 

KonradN

Super-Moderator
Mitarbeiter
Das JSON muss natürlich passen. Wenn du eine Map deserialisieren willst, das muss es auch so geschrieben worden sein.

Wenn das Format nicht geändert werden kann, dann musst du da ggf einen eigenen Adapter bauen oder du gehst hin und baust deine Entities so, dass sie dem JSON entsprechen. (Sowas am Besten immer testen, in dem du serialisierst und schaust, was raus kommt)

Aber das JSON, dass du gepostet hast sieht ganz dubios aus!
 

doktordoom

Mitglied
Hi @KonradN,
Danke für dein Support. Der parser funktioniert jetzt wie gewollt. Unten ein Auszug was geschrieben wurde.

Java:
[
  {
    "Node.Name": "Papier",
    "Is.Visible": false
  },
  {
    "Node.Name": "Qualität",
    "Is.Visible": false
  },
  {
    "Node.Name": "Layout",
    "Is.Visible": false
  }
]
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
S Read End Dead Allgemeine Java-Themen 2
S Read End Dead Allgemeine Java-Themen 1
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
I Javafx Open/Read und Tree Funktion Allgemeine Java-Themen 14
M Read end ded [PipedInputStream...] Allgemeine Java-Themen 0
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T InvalidClassException - Read null attempting to read class descriptor for object Allgemeine Java-Themen 8
A RandomAccessFile.read(byte[] b) Allgemeine Java-Themen 9
1 Check read/write permission for file Allgemeine Java-Themen 4
J write / read Problem Allgemeine Java-Themen 9
E Durch System.in.read() blockierten Thread stoppen Allgemeine Java-Themen 10
N read streams umleiten Allgemeine Java-Themen 2
G Read only Eclipse- Datei Allgemeine Java-Themen 5
W Konflikt byte->int, in.read->arraycopy Allgemeine Java-Themen 7
M BufferedReader.read(char[] cbuf) liefert falsche Werte? Allgemeine Java-Themen 4
A Probleme mit ImageIO.read( . ) Allgemeine Java-Themen 12
S NoClassDefFoundException - ImageIO.read - Applet Allgemeine Java-Themen 3
S java.io.InputStream.read(byte[] b) überschreiben Allgemeine Java-Themen 33
A System.in.read() Problem Allgemeine Java-Themen 6
R read/readline blockiert Allgemeine Java-Themen 5
F Zu große Werte beim byteweisen Lesen mit BufferedReader.read Allgemeine Java-Themen 5
C ImageIO die read-Methode liefert mir ein null- Wert zurück Allgemeine Java-Themen 10
M InputStream.read abbrechen Allgemeine Java-Themen 2
M JSON Parsing von youtube video comment replies Allgemeine Java-Themen 4
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
O JSON in Integer parsen Allgemeine Java-Themen 5
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
G Json POST-REQUEST Allgemeine Java-Themen 14
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
D JSON to String Allgemeine Java-Themen 31
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
F Json in sql speichern und lesen Allgemeine Java-Themen 10
F Alte Passörter mit Gson und Json in SQL speichern? Allgemeine Java-Themen 5
C Nested JSON in Java ansprechen [Wordpress Rest Api] Allgemeine Java-Themen 26
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
agent47 JSON verarbeiten Allgemeine Java-Themen 4
G JSON parsen Allgemeine Java-Themen 3
Thallius Simple JSON Parser Error null Allgemeine Java-Themen 6
J Java JSON-Datei aus .Zip auslesen und Download mit Progress Bar Allgemeine Java-Themen 20
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
M Changelog aus JSON Allgemeine Java-Themen 2
M JSON NullPointerException Allgemeine Java-Themen 5
B json zu java class Allgemeine Java-Themen 2
F Java Restapi JSON Allgemeine Java-Themen 5
G Json-Lib NoClassDefFoundError Allgemeine Java-Themen 3
O JSON String bauen aus Liste Allgemeine Java-Themen 2
O Vorteile von GSON ggü. JSON "per Hand" Allgemeine Java-Themen 4
O JSON: ClassNotFound Allgemeine Java-Themen 8
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
J Lucene suche in Json (CouchDB) Allgemeine Java-Themen 2
K Regex JSON Allgemeine Java-Themen 3
G JSON Object auslesen Allgemeine Java-Themen 1
H "File too large" - genauere IOException-Behandlung Allgemeine Java-Themen 5
H Sicherer File Tresor Allgemeine Java-Themen 13
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben