# lesen von json Dateien in Intellij



## dvdlly (9. Nov 2022)

Hallo,

Ich habe ein Verzeichnis, dass aus lauter Ordnern besteht, in denen jeweils genau eine .json Datei enthalten ist. Ich möchte diese Dateien jeweils lesen, um dann aus den erzeugten json Objekten Werte auszulesen.
- Oberverzeichnis
  - Ordner1
      -O1.json
   - Ordner2
      -O2.json
     .......

Ich habe jetzt 4 verschiedene Posts dazu gelesen, aber alle sagen etwas anderes (es gibt sicherlich verschiedene Möglichkeiten, aber die Tutorien haben teilweise veraltete Libraries benutzt.
Kann mir jemand sagen, welche Library ich benutzen könnte?
Danke!


----------



## Jw456 (9. Nov 2022)

Zum Arbeiten mit Json vielleicht "Gson" als Lib.

Um auf die Verzeichnisse zu kommen relative Pfad angaben.
Und die klaschischen File Methoden. Vielleicht das  oberste Verzeichnis mittels  Rekursion  durchlaufen






__





						Laden…
					





					www.baeldung.com


----------



## KonradN (9. Nov 2022)

Die erste Frage wäre für mich erst einmal, was in den JSON Dateien drin steht.

Wenn da immer die Daten im gleichen Format stehen und das Format entsprechend fest gelegt ist, dann baut man das entsprechende Model und dann kann man JSON einfach in das Model parsen lassen. Dabei ist egal, ob man gson, jackson oder eine andere Alternative verwendet. Das Lesen der JSON Datei wird dann ein 2-Zeiler.

Die JSON Datei nur als JSON zu lesen um dann mit JsonObject Elementen selbst herum zu hantieren ist aus meiner Sicht einfach unübersichtlich und viel zu viel manueller Aufwand.


----------



## dvdlly (9. Nov 2022)

Die Dateien haben alle das selbe Format:

```
{
  "title": "nodeconfigtestres",
  "results": [
    {
      "test": "pts/fio-1.14.1",
      "arguments": "Type: Random Read - Engine: Linux AIO - Buffered: No - Direct: Yes - Block Size: 4KB - Disk Target: Default Test Directory",
      "units": "MB/s",
      "results": {
        "Amazon Elastic Block Store": {
          "value": "11.7",
          "all_results": "11.7:11.7:11.7"
        }
      }
    }, ....
```

.... soll hier bedeuten, dass das array results aus Einträgen im gleichen Format besteht.

Ich habe die gson Artikel überflogen, aber nirgends war von files die Rede, das hat ein wenig erschlagend gewirkt ehrlich gesagt... 😅


----------



## KonradN (9. Nov 2022)

Woher Daten kommen ist auch generell egal. Entweder die Daten liegen direkt vor (Also bei JSON in Form einen Strings) oder die Daten werden gelesen (Stream oder Reader). Da findet man somit oft keine Datei.

Und wenn das Format immer gleich ist, dann kannst Du einmal die Klassen schreiben (ggf. mit Annotations, die das JSON etwas steuern) und schon ist ein Einlesen sehr einfach machbar mit Code wie z.B.:

```
try (FileReader reader = new FileReader(filename)) {
    Gson gson = new Gson();
    YourEntity entity = gson.fromJson(reader, YourEntity.class);
    // Hier etwas mit entity machen ...
}
```


----------



## dvdlly (9. Nov 2022)

Okay, danke euch beiden. Kann man irgendwo nachlesen, wie man die YourEntity Klasse implementieren muss? Ich weiß beim Attribut "Amazon Elastic Block Store" nicht mehr weiter - ich dachte die Attributsnamen benutzt man auch in der Implementierung, aber dieser Name enthält ja whitespaces.


----------



## KonradN (9. Nov 2022)

Gson @SerializedName
					

Gson @SerializedName is used to change the name of fields between JSON and Java objects while the serialization and deserialization process.




					howtodoinjava.com


----------



## Jw456 (9. Nov 2022)

YourEntity  ist die Daten Klasse(Model) von der gesprochen wurde.


----------



## dvdlly (9. Nov 2022)

Wenn nur ein Teil des Json ausgelesen werden muss und zwar immer der gleiche, kann man das irgendwie abkürzen? Ich brauche zb nur value aus results


----------



## KonradN (9. Nov 2022)

Gson Deserialization Cookbook | Baeldung
					

How to deserialize Json with the Gson library - a cookbook with the most common scenarios.




					www.baeldung.com
				





> As you can see, *Gson will ignore the unknown fields* and simply match the fields that it's able to.


----------



## dvdlly (9. Nov 2022)

Danke!


----------



## Jw456 (9. Nov 2022)

__





						JSON Model Generator - IntelliJ IDEs Plugin | Marketplace
					

Tool to covert JSON string to Java class.




					plugins.jetbrains.com
				




Ist sicherlich auch eine Möglichkeit.


----------



## dvdlly (10. Nov 2022)

Das öffnen einer File schlägt bereits fehl - ich führe das hier aus:


```
package org.workflowsim.utils;

import com.google.gson.Gson;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;

public class RuntimeData {

    public void extract_benchmarks(File file){
        try (FileReader reader = new FileReader(file.getName())) {
            Gson gson = new Gson();
            TestResult entity = gson.fromJson(reader, TestResult.class);
            System.out.println(entity);
        }
        catch (IOException e){
            throw new RuntimeException(e);
        }
    }


    public static void main(String[] args) {
        RuntimeData test = new RuntimeData();
        try {
            File f = new File("pfad zur datei(mit realpath erzeugt)/nodeconfigtestres.json");
            test.extract_benchmarks(f);
        }
        catch (Exception e){
            e.printStackTrace();
            }
        }
}
```

Aber kriege eine "file not found" exception. Seht ihr vielleicht woran das liegt? Ist bestimmt ein trivialer Fehler.


----------



## KonradN (10. Nov 2022)

Du nutzt ein `file.getName()` - das ist nur der Name der Datei und nicht der ganze Pfad:




__





						File (Java SE 17 & JDK 17)
					

declaration: module: java.base, package: java.io, class: File



					docs.oracle.com
				





> Returns the name of the file or directory denoted by this abstract pathname. This is just the last name in the pathname's name sequence. If the pathname's name sequence is empty, then the empty string is returned.



FileReader hat aber auch ein Konstruktor, der ein File nimmt - da ist es also nicht notwendig, sich wieder den Dateinamen geben zu lassen. Daher reicht es aus, da direkt zu sagen:
`try (FileReader reader = new FileReader(file)) {`


----------

