JSON einlesen

**Erste Frage: **

Hallo Freunde der Sonne,

ich habe eine Aufgabe mit der ich nicht ganz klarkomme:
Ich soll gewisse JSON-Daten (die ich noch vorstellen werde) in Objekte (Java) der selbstkreirten Klasse “Alternatives” umwandeln. Dazu soll ich die JSON-Daten parsen.
Die Funktion, mit der die Parserei erfolgen soll, soll so aussehen: Function Alternatives[] parseJson(String result) {} Diese soll nicht in der Klasse “Alternatives” sein.

Eine dazugehörige JSON-Datei könnte wie folgt aussehen:

result: {
  "results": [
    {
      "alternatives": [
        {
          "transcript": "Hilfe hilf mir helfen sie mir Polizei vorher",
          "confidence": 0.65394372
        }
      ]
    },
    {
      "alternatives": [
        {
          "transcript": " feuerwehr Krankenwagen Notarzt",
          "confidence": 0.85941476
        }
      ]
    }
  ]
}

Meine Klasse Alternatives:

public class Alternatives
{
	private String transcript;
	private int confidence;
	
	public Alternatives(String transcript, int confidence)
	{
		this.transcript = transcript;
		this.confidence = confidence;
	}
	
	public void printAlternatives()
	{
	    System.out.println("transcript: " + this.transcript);
		System.out.println("confidence: " + this.confidence);
	}
}

Ich soll nun mit der obig erwähnten Funktion aus solcherlei Dateien Objekte der Klasse Alternatives erstellen. Da ich jedoch noch ein ziemlicher Anfänger bin, wollte ich fragen, ob ihr mir mit Hinweisen hier auf die Sprünge helfen könntent, bevor ich stundenlang im Dunkeln tappe?
Ich wäre dankbar für Antworten!

Zweite Frage

Ich habe versucht, ein externes Package (Prog1Tools) einzubinden und in meinem Programm zu verwenden. Um dies tun zu können, mußte ich die Umgebungsvariable CLASSPATH erzeugen und den Pfad zum Package angeben. Das habe ich gemacht.

Wenn ich jedoch nun versuche, mit dem Befehl “java IrgendEinProgramm” eine .java-Datei auszuführen, erhalte ich eine Fehlermeldung, die besagt, daß die Hauptklasse “IrgendeinProgramm” nicht gefunden oder geladen werden konnte. Was habe ich falsch gemacht, was ist falsch gesetzt und wie kann ich das Problem beheben?

Ich danke für Antworten!

Auch wenn du Anfänger bist, wäre es schön, ein wenig Eigeninitiative zu zeigen. Was hast du schon, wo hapert es konkret?
Oder brauchst du mehr allgemein Tipps, in welche Richtung du losgoogeln sollst?

Ich habe mal gson verwendet, um Jason-Dateien zu parsen. Ob das noch die beste Wahl ist, weiß ich nicht, ist schon ein paar Jahre her.

Entwickelst du ohne IDE?

Derzeit entwickle ich mit Eclipse. Allerdings möchte ich, daß auch das entwickeln ohne IDE funktioniert, da ich mich nicht damit zufrieden gebe, das es nicht funktioniert.
Ich habe etwas mit diesen Klassen hier versucht: http://repo1.maven.org/maven2/org/glassfish/javax.json/1.0-b06/javax.json-1.0-b06.jar
Ich erhalte nun folgende Ausgabe:

Array:
Array:
transcript: Hilfe hilf mir helfen sie mir Polizei vorher
confidence: 0.65394372
Array:
transcript: feuerwehr Krankenwagen Notarzt
confidence: 0.85941476

Ich denke, ich komme nicht drum herum, einen Algorithmus zu schreiben, der diesen output selbe interpretiert und den Instanzvariablen zuweist. Aber erstmal werde ich die Funktionsweise des Programms studieren.

Ich würde es durchaus mal mit Gson probieren. Ich habe damit, was Json angeht gute Erfahrungen gemacht.

[OT]Was hat es mit den alternatives eigentlich auf sich? Also wofür ist das ganze? (Falls du das erzählen darfst)[/OT]

ich die Umgebungsvariable CLASSPATH erzeugen und den Pfad zum Package angeben

Muss man nicht unbedingt mit Umgebungsvariablen machen, der Kommandozeilenparameter -cp beim Aufruf tut’s auch. Du gibst damit aber nicht den Pfad zu irgendeinem Package an, sondern zu jars oder zu ausgepackten .class-Dteien. Lies Dir am besten zum Thema Kompilieren und starten von Java-Apps von der Kommandozeile folgendes durch How to Compile and Run Java Code from a Command Line

  • In Deiner Java-Klasse Alternatives ist confidence ein int, im JSON aber eine Fließkommazahl. Ändere Deine Java-Klasse entsprechend (float oder double).
  • Für’s Parsen von JSON nutze ein Framework. GSON ist eine gute Wahl.

Vielen Dank für bisherige Antworten! Ich weiß leider nicht, ob ich diesbezüglich „was erzählen darf“, also laß ich das mal lieber :smiley:

Ich habe jetzt einen Weg gefunden, die Daten in die Datei zu speichern, wobei ihm allerdings ein Fehler unterläuft, den ich im folgenden erläutere. Grundlage ist immernoch obige Datei „data.json“.

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Map.Entry;

import javax.json.Json;
import javax.json.JsonArray;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonStructure;
import javax.json.JsonValue;
import javax.json.JsonValue.ValueType;

import java.io.*;

public class createAlternatives 
{
	static public FileWriter fw = null;
	static public BufferedWriter bw = null;
	
    public static void parseJson(String fileName) {
        FileReader fr;
        JsonStructure struct;
        try {
            fr = new FileReader(fileName);
            JsonReader reader = Json.createReader(fr);
            struct = reader.read();
            JsonValue value = struct;
            print(value);
            reader.close();
            fr.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        closeFile();
    } 
    
    private static void print(JsonValue value) {
    	
    	try {
            fw = new FileWriter("ausgabe.txt");
            bw = new BufferedWriter(fw);
    	} catch(IOException e) {System.out.println("");}
    	
        JsonObject object = null;
        if (value.getValueType() == ValueType.OBJECT) {
            object = (JsonObject) value;
            for (Entry<String, JsonValue> set : object.entrySet()) {
                if (set.getValue() instanceof JsonArray) {
                    print(set.getValue());
                } else {
                	try {
                	    bw.write(set.getValue()+"");
                	    bw.newLine();
                	    System.out.println(set.getValue());
                	} catch(IOException e) {System.out.println("error line 56");}
                }
            }
        } else if (value.getValueType() == ValueType.ARRAY) {
            JsonArray array = (JsonArray) value;
            for (JsonValue val : array)
                print(val); 
        }
    } 
    
    static public void closeFile()
    {
        try{
        	bw.close();
        } catch (IOException e) {System.out.println("error in line 67");}	
    }
}

Die Ausgabe auf dem Bildschirm lautet ordnungsgemäß

Hilfe hilf mir helfen sie mir Polizei vorher
0.65394372
feuerwehr Krankenwagen Notarzt
0.85941476

Der Inhat der Datei allerdings nur:

feuerwehr Krankenwagen Notarzt
0.85941476

Jetzt lautet meine Frage, was ich da falschgemacht haben könnte? :confused:

jedes Mal wenn der Writer neu erzeugt wird, wird mit hoher Wahrscheinlichkeit das vorherige überschrieben,
außerdem sowieso alles reichlich kaputt wenn nur ein Writer gecloset, der Rest sich selber überlassen wird,
da musst du System reinbringen

die print-Methode wird mehrmals aufgerufen, schlechter Platz zum Erstellen eines Writers,
außer Erstellung nur wenn bisher noch nicht gesetzt if (xy == null) { xy = .. }

besser wohl vorerst das Erstellen der Writer, wie ja auch der eine close-Aufruf, in parseJson(),

was nicht heißt dass man nicht grundsätzlich noch vieles anders machen kann,
statische Variable etwa schlecht, wenn nun zwei Akteure gleichzeitig parseJson() aufrufen würden…,
passiert in einfachen Programmen natürlich nicht mal eben