JSON auslesen und Labels in GUI verwenden

learningbydoing

Aktives Mitglied
Hallo zusammen,

ich habe wieder einmal ein Problem :)

Ich möchte eine Json Sprachdatei auslesen und die Werte in die GUI einfügen lassen. Leider funktioniert dies nur beim "Run Projekt" innerhalb der IDE. Nach einem Clean and Build und dem ausführen der .jar, werden die Werte nicht angezeigt.

Der Code zum auslesen der JSON:

Java:
package main.java...;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;


public class JsonsFileAuslesen {

    public String jsonAuslesenFunktion(String labelName, String dateiName) throws IOException {
        String label;
        String path = "jsons/" + dateiName;
        JsonObject jsonObject;
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path);
        JsonReader jsonReader = Json.createReader(inputStream);
        jsonObject = jsonReader.readObject();
        
        
        label = jsonObject.getString(labelName);
        
        return label;
    }

    public String jsonWertAuslesen(String key, String jsonFile) {
        String wert = "";
        
        try {
            JsonsFileAuslesen keyBekommen = new JsonsFileAuslesen();
            wert = keyBekommen.jsonAuslesenFunktion(key, jsonFile);
        } catch (IOException ex) {
            // Damit etwas im Catch Block steht
        }

        return wert;
    }
}

Die JSON:

Code:
{
    "sprache": "German",
    "parameterLettering": "Parameter",
    "wordOf": "von",
    "resultLettering": "Ergebnis",
    "statusLettering": "Status",
    "cancelButton": "Abbruch",
    "saveAndQuitButton": "Report speichern und beenden",
    "checkfilenotfound": "Checksummen-Prüfdatei nicht gefunden, Programm wird beendet",
    "reportwillbesavedunder": "Der Report wird abgelegt unter"
}

Diese Schriften sollen über die JSON gezogen werden:

1663660618769.png

Woran kann das liegen? Vielleicht weil sich der Pfad in der .jar verändert hat? ...

Vielen Dank schon einmal im Voraus!
:D
 

Jw456

Top Contributor
laut deimen code sollte sich die Json Datei in einem unterOrdner unter der Jar Datei befindden was wohl nicht ist.

\...\OrdnerJarDatei\deineJar.jar
\...\OrdnerJarDatei\jsons\deineJsonDatei
 

KonradN

Super-Moderator
Mitarbeiter
Neben dem wichtigen Hinweis von @fhoffmann noch ein Hinweis zur Fehlersuche:

Das jar File ist auch nur ein ZIP, d.h. Du kannst es zu einem ZIP umbenennen um Dir den Inhalt anzusehen. Sind die JSON Dateien in dem Ordner jsons?

Und auch ganz wichtig: Gross- / Kleinschreibung beachten? Auf dem Dateisystem ist z.B. test.json und Test.json bei Windows gleich. Aber beim Laden aus der jar sind das zwei unterschiedliche Dateien und wenn Du test.json laden willst und es heisst Test.json, dann wird es nicht gefunden.

laut deimen code sollte sich die Jaon Datei in einem unterOrdner unter der Jar Datei befindden was wohl nicht ist.
Wie kommst Du darauf? Er greift ja über getClass().getClassLoader().getResourceAsStream(path); zu.
 

learningbydoing

Aktives Mitglied
Hallo zusammen,

vielen Dank schon einmal für Eure schnellen Antworten!

Habe den Catch Block angepasst @fhoffmann.

Die Jar scheint trotzdem richtig aufgebaut und benannt zu sein (nicht wundern in main sind die Klassen):

1663666548842.png
1663666573863.png

Habe es davor mit .properties gemacht und da hat alles einwandfrei funktioniert. :(


Viele Grüße
 

KonradN

Super-Moderator
Mitarbeiter
Die Bilder zeigen den Inhalt der Jar Datei?

Hast Du die Namen kontrolliert bei den aufrufen, so dass die Schreibweise genau "de-Labels.json" "en-Labels.json" und "Fenster-Titel.json" entspricht (Also alles klein und nur "L", bzw. "F" und "T" groß)?

Bekommst Du irgend welche Fehler oder Exceptions?

Ansonsten füg noch mehr Ausgaben hinzu, so das Du testweise ausgibst, auf was Du zugreifst und was die jeweiligen Ergebnisse sind.

Du könntest auch zeigen, wie Du die Methode z.B. aufrufst. Dann könnte man das, was wir Dir sagen, dass Du es prüfen sollst, auch selbst prüfen.
 

learningbydoing

Aktives Mitglied
Ja Rechtschreibung ist soweit alles richtig!
Ich rufe die Methode eigentlich ganz normal auf. Objekt erstellen und die Funktion im Objekt verwenden.

Java:
String wert = "";
JsonsFileAuslesen keyBekommen = new JsonsFileAuslesen();
wert = keyBekommen.jsonWertAuslesen("wordOf", "de-Labels.json");

Als kleines Beispiel...

Wie gesagt ich habe sonst eigentlich alles genauso gemacht wie davor bei den Properties. Da hat es ja funktioniert...
 

KonradN

Super-Moderator
Mitarbeiter
Also ich habe gerade nicht zu viel Zeit, das jetzt zu analysieren, aber ich habe einfach einmal schnell etwas nachgestellt:
  • Abhängigkeiten eingefügt (Ich habe jakarta.json genommen, aber das spielt keine Rolle).
  • Dann die Ressource eingebaut und einfach mal Deine Methode kopiert. Ich habe sie schnell static gemacht und dann das getClass durch Klassenname.class ersetzt:

--> getResourceAsStream lieferte bei mir immer null? Ich weiss gerade nicht, wieso der classloader da Probleme hat.

Schnelle Änderung:
a) Vor das jsons noch ein "/": String path = "/jsons/" + dateiName;
b) getClassloader() entfernen: InputStream inputStream = getClass().getResourceAsStream(path);

Nach meinem aktuellen Verständnis hätte das aber mit dem Aufruf auf dem ClassLoader selbst so funktionieren müssen. Halt mit dem Unterschied, dass es eben nicht am Ort der Klasse anfängt zu suchen sondern im Root des Classpath - daher hätte es ohne / vor dem jsons funktionieren müssen (wäre so meine Aussage - aber bei mir ging es so eben nicht).

Evtl. klappt dieser Workaround mit den beiden Schritten auch bei Dir. Erläuterung kommt evtl. später wenn ich mehr Zeit habe um mir das noch einmal im Detail anzusehen.

Edit: Evtl. vorab schon eine Vermutung: Das dürfte am Modul-System von Java 9 und höher liegen. Durch den Aufruf auf dem ClassLoader ist vermutlich die "Berechtigung" weg, darauf zu zu greifen. Dokumentation von Modul.getResourceAsStream könnte man als ersten Schritt zu Rate ziehen - da dürfte etwas mehr diesbezüglich drin stehen. Und man kann es testen - evtl. mal statt getClassloader ein getModul probieren - da dürfte es vermutlich noch weiterhin funktionieren. Aber wie gesagt: Mir fehlt die Zeit, das jetzt im Detail zu recherchieren und dann zu beschreiben.

Edit2: Evtl. auch einfach testbar durch eine Anpassung der module-info.java (so vorhanden): Entweder direkt im Kopf mit open module xxxx starten oder ein opens jsons; hinzufügen. Wenn keine module-info.java verwendet wird, dann wird es schwerer - da gäbe es dann nur die Kommandozeile, die ein add-opens ermöglichen könnte.
 
Zuletzt bearbeitet:

learningbydoing

Aktives Mitglied
Also ich habe gerade nicht zu viel Zeit, das jetzt zu analysieren, aber ich habe einfach einmal schnell etwas nachgestellt:
  • Abhängigkeiten eingefügt (Ich habe jakarta.json genommen, aber das spielt keine Rolle).
  • Dann die Ressource eingebaut und einfach mal Deine Methode kopiert. Ich habe sie schnell static gemacht und dann das getClass durch Klassenname.class ersetzt:

--> getResourceAsStream lieferte bei mir immer null? Ich weiss gerade nicht, wieso der classloader da Probleme hat.

Schnelle Änderung:
a) Vor das jsons noch ein "/": String path = "/jsons/" + dateiName;
b) getClassloader() entfernen: InputStream inputStream = getClass().getResourceAsStream(path);

Nach meinem aktuellen Verständnis hätte das aber mit dem Aufruf auf dem ClassLoader selbst so funktionieren müssen. Halt mit dem Unterschied, dass es eben nicht am Ort der Klasse anfängt zu suchen sondern im Root des Classpath - daher hätte es ohne / vor dem jsons funktionieren müssen (wäre so meine Aussage - aber bei mir ging es so eben nicht).

Evtl. klappt dieser Workaround mit den beiden Schritten auch bei Dir. Erläuterung kommt evtl. später wenn ich mehr Zeit habe um mir das noch einmal im Detail anzusehen.

Edit: Evtl. vorab schon eine Vermutung: Das dürfte am Modul-System von Java 9 und höher liegen. Durch den Aufruf auf dem ClassLoader ist vermutlich die "Berechtigung" weg, darauf zu zu greifen. Dokumentation von Modul.getResourceAsStream könnte man als ersten Schritt zu Rate ziehen - da dürfte etwas mehr diesbezüglich drin stehen. Und man kann es testen - evtl. mal statt getClassloader ein getModul probieren - da dürfte es vermutlich noch weiterhin funktionieren. Aber wie gesagt: Mir fehlt die Zeit, das jetzt im Detail zu recherchieren und dann zu beschreiben.

Edit2: Evtl. auch einfach testbar durch eine Anpassung der module-info.java (so vorhanden): Entweder direkt im Kopf mit open module xxxx starten oder ein opens jsons; hinzufügen. Wenn keine module-info.java verwendet wird, dann wird es schwerer - da gäbe es dann nur die Kommandozeile, die ein add-opens ermöglichen könnte.
Vielen Dank für deine ausführliche Erklärung. Leider wird das Projekt in Java 8 entwickelt :(

Es bleibt bei dem eigentlichen Problem, dass alles ganz normal angezeigt wird, wenn ich das Projekt aus der IDE starte. Mache ich aber einen Clean and Build und benutze die .jar, bleibt das Programm in seinem Ladestatus hängen -> also hat wahrscheinlich keinen Zugriff auf die Jsons, bzw. kann sie nicht finden.
 

KonradN

Super-Moderator
Mitarbeiter
Ok, mit Java 8 hat man die beschriebene Problematik nicht.

Einfach noch einmal die bekannten Punkte durchgehen:
  • Also die Bilder in #5 sind vom jar File aufgenommen? Im jar File sind die Dateien also drin.
  • Die Schreibweise ist geprüft - Du hast also de-Labels.json auch im Code (Hast Du es mal zu Testzwecken ausgegeben?)
  • Prüfe den InputStream auf null - da wird halt keine IOException geworfen sondern eine NPE und die fängst Du ja nicht. Check und Ausgabe / Log wären sinnvoll um zu bestätigen, dass dies so nicht klappt.
  • Dürfte im Java 8 Umfeld nichts bringen, aber die beiden Punkte a und b kannst Du auch bei Java 8 mal probieren. Da erwarte ich aber keine Veränderung. (Oder entwickelst du ggf zwar mit Java 8 aber führst es mit einer höheren Java Version aus? dann könnte es wieder zu so Problemen kommen. Wie führst Du das jar aus? Evtl. mal ein java -version auf der Kommandozeile machen und auch das jar über die Kommandozeile starten mit java -jar ....)
 

KonradN

Super-Moderator
Mitarbeiter
Hast Du probiert, die Zeile mal anzupassen zu:
InputStream inputStream = getClass().getResourceAsStream("/jsons/" + dateiName);

Der Stream ist halt null, wenn die Ressource nicht gefunden werden konnte. Und da ist die Frage, wieso das so ist.

Aber noch einmal vom letzten Post:
Wie führst Du das jar aus? Evtl. mal ein java -version auf der Kommandozeile machen und auch das jar über die Kommandozeile starten mit java -jar ....
 

learningbydoing

Aktives Mitglied
Danke nochmal für die vielen Antworten!

Ich habe es jetzt hinbekommen, indem ich zur Haupt .jar die Plugin javax-json-1.0.4.jar eingefügt habe. Damit funktioniert es jetzt.:) Ist nicht die schönste Form, aber immerhin funktioniert es mal👍
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M json page 2 auslesen XML & JSON 1
M Json auslesen XML & JSON 7
B Json Objekt sinnvoll plätten? XML & JSON 1
W com.android.volley.ParseError: org.json.JSONException: End of input at character 0 of XML & JSON 6
mananana Frage zu JSON XML & JSON 3
wofus JSON filtern nach bestimmten Wert XML & JSON 7
N JSON export String Unicode? XML & JSON 6
L Json reader XML & JSON 15
megusta JSON umschreiben (converter)? XML & JSON 4
P verschachteltes json verändern XML & JSON 3
Avalon JSON flatten und wieder in DTO konvertieren XML & JSON 21
M Objekt zu jsonArray in .json datei hinzufügen ? XML & JSON 3
Z json inkl. Array/Verschachtelung erstellen XML & JSON 2
J Object in JSON Datei einlesen und als neues Object erzeugen (in ein Object Array) XML & JSON 29
Trèfle Formatierung v. JSON File XML & JSON 7
K JSON mit GSON nutzen XML & JSON 4
S Java REST Client + Json XML & JSON 8
W Search Value in Json XML & JSON 6
K JSON-Bibliothek XML & JSON 5
M Großes Json Objekt benutzen XML & JSON 5
M Xml oder Json? XML & JSON 15
J JSON zu Java mit der GSON Google API XML & JSON 0
G Jackson JSON: Dynamische Serialisierung XML & JSON 6
W Json von URL Lesen (mit Gson Library) XML & JSON 3
W Json von URL Lesen XML & JSON 2
L Jackson JSON: Probleme beim einlesen XML & JSON 1
J JSon-Converter gesucht XML & JSON 2
Q Konvertierung von json zum Java Objekt nach vorgegebenem Schema XML & JSON 3
J JSon <-> XML zwecks Validierung XML & JSON 4
M [JSON] Wie Splitten? XML & JSON 14
G Mit JSON Java und C# verbinden XML & JSON 4
J Auslesen der Länge einer XML-Datei in Android Studio XML & JSON 8
Kanda Sorata Eingabefelder von Excel Dateien auslesen XML & JSON 1
K XML vernünftig auslesen XML & JSON 9
K XML Datei erstellen und Daten daraus in Java auslesen XML & JSON 6
H SOAPBody auslesen XML & JSON 0
B XML auslesen, benötige Hilfe XML & JSON 13
I Liste in YAML Datei speichern und wieder auslesen XML & JSON 1
W XML einlesen und Attribute auslesen XML & JSON 1
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
K XML Auslesen, wie abspeichern? XML & JSON 32
D Attribute aus XML Auslesen XML & JSON 5
W Kindelemente mit JDOM eines bestimmten Attributes auslesen XML & JSON 6
R Apache POI: Gezieltes Auslesen von Zellen XML & JSON 2
S XMl auslesen:@ output ? XML & JSON 1
Z Verschachtelte XML auslesen XML & JSON 3
C JDOM: Value ohne Unterelemente auslesen XML & JSON 1
C XPath: Alle Kinder in einer Schleife auslesen XML & JSON 2
I XML IDs auslesen, erst X dann Y XML & JSON 2
S XML - rekursives auslesen - Zeilenumbruch als NodeValue? XML & JSON 3
O XML richtig auslesen XML & JSON 7
Kenan89 XML Tag-ID auslesen mit getElementById XML & JSON 2
J Excel zeilenweise auslesen - POI XML & JSON 5
J Excel Zellen auslesen - automatischer Stopp bei leerer Zelle XML & JSON 2
I XPath Namensräume und auslesen einzelner Knoten XML & JSON 3
S SVG auslesen und darstellen XML & JSON 5
G xpath: in Kindelement zwei Attribut-Werte auslesen XML & JSON 2
G xpath: Inhalt eines Kindelements auslesen XML & JSON 2
1 Html tabelle auslesen??? XML & JSON 6
JanUlrich Tabelle auslesen XML & JSON 2
A XSl mit JDom auslesen XML & JSON 1
J Anzahl der Elemente in einem XML-Dokument auslesen XML & JSON 7
K XMl auslesen XML & JSON 19
P Poi /XSSF : Excel-Tabelle auslesen XML & JSON 2
S XSD-Datei zulässige Werte auslesen XML & JSON 3
D rss auslesen XML & JSON 2
S Attribute von Elementen auslesen mit XPath XML & JSON 2
M Große Datei auslesen/in dieser suchen XML & JSON 2
M RSS-Datei auslesen von Yahoo Webservice XML & JSON 4
N Google Wetter XML (nur current_condition) auslesen mit Java XML & JSON 15
J Dateinamen beim Start auslesen XML & JSON 8
eQuest XML Jaxen Attribute auslesen XML & JSON 2
E XML Datei mit DOM auslesen (Text mit Attributen) XML & JSON 2
P jdom XML-Encoding auslesen XML & JSON 12
H XML Attribute auslesen XML & JSON 5
Nicer Bestimmten Wert aus einer XML Auslesen XML & JSON 34
L XML Daten auslesen und in Tabelle (Array) speichern XML & JSON 1
L XML Dokument auslesen funktioniert nicht richtig XML & JSON 2
C Attributwert aus XML auslesen XML & JSON 10
H XML String auslesen XML & JSON 4
E XML Knoten mit rekursiver Methode auslesen XML & JSON 3
S Dom Baum auslesen XML & JSON 12
J Properties auslesen (Jar) XML & JSON 1
S auslesen XML & JSON 9
Z XML auslesen, Elemente daraus entfernen und als neue XML zurückgeben XML & JSON 2
M XMI-Datei auslesen XML & JSON 4
T EXSD auslesen mit XPath und JDOM XML & JSON 8
M XML-Datum als Referenz auf Objekt-Variable auslesen XML & JSON 5
Spot84 xmi auslesen XML & JSON 20
G Welche Klassen zum erzeugen/auslesen eines XML Files verwend XML & JSON 9
G Xml File schematisch auslesen XML & JSON 2
P NullPointerException beim Auslesen XML & JSON 8
N XML-String in MIDP auslesen XML & JSON 3
H mit JDOM Verarbeitungsanweisungen und Kommentare auslesen XML & JSON 2
K XML auslesen (simpel) XML & JSON 10
X XML File auslesen/parsen u. in ne Hashmap speichern XML & JSON 2
HeRaider Definitionen auslesen und Encoding XML & JSON 3
A SVG Datei auslesen und Batik XML & JSON 1
M XML werte auslesen ! XML & JSON 3
M XML File während Applet-Start auslesen? XML & JSON 10

Ähnliche Java Themen

Neue Themen


Oben