Json reader

LouCyphre

Bekanntes Mitglied
Hallo,

ich versuche aus einem .json Daten zu lesen.

Java:
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;

class Scratch {
    public static void main(String[] args) {

        final File questionFile = new File("/questions.json");
        Scratch scratch = new Scratch();
        System.out.println(scratch.readQuestion().question);

    }
    public void readQuestion() {

        try {

            JsonElement questionElement = JsonParser.parseReader(new FileReader(questionFile));
            JsonObject questionObject = questionElement.getAsJsonObject();

            JsonArray jsonArrayOfQuestions = questionObject.get("questions").getAsJsonArray();

            for (JsonElement qElement : jsonArrayOfQuestions){
                JsonObject qJsonObject = qElement.getAsJsonObject();

                String question = qJsonObject.get("question").getAsString();



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

    }
}

Soweit so schlecht. Der FileReader kann das questionFile nicht finden. Die .json ist im resoureces Ordner abglegt. Soviel zum ersten Problem. Da ich aus dem File nichts lesen kann, kann ich gerade auch nicht abwegen ob der Rest überhaupt so klappt.

JSON:
{"questions":[
  {
    "question": "Was ist kein Buchstabe?",
    "answers" : "A" // hier eigentlich noch 3 weitere Strings
  },
  {
    "question" :"Andere Frage ...?",
    "answers" : "..."
  }
 ]
}

So ist der grobe Aufbau der Json. Hier haber ich noch das Problem, das answers eigentlich eine Liste, hier aber nur was einzelnes erwartet wird. Wie kann ich daraus eine Liste machen?


Danke,
Lou
 

LouCyphre

Bekanntes Mitglied
Okay, danke erstmal. hatten wir ja schonmal das Thema.

Java:
InputStreamReader questionFile = getClass().getResourceAsStream("questions.json");

JsonElement questionElement = JsonParser.parseReader(new InputStreamReader(questionFile));

So gehts leider auch nicht.

es wird mir getClass() rot unterstrichen
 

mihe7

Top Contributor
Ja, weil Deine Methode static ist. In dem Fall wäre es Scratch.class.getResourceAsStream(...). Außerdem liefert das keinen InputStreamReader sondern einen InputStream.
 

LouCyphre

Bekanntes Mitglied
Ja, weil Deine Methode static ist
Die Main jetzt?

Java:
InputStream questionFile = Scratch.class.getResourceAsStream("questions.json");

JsonElement questionElement = JsonParser.parseReader(new InputStream(questionFile));

bei questionElement stimmt aber immer noch was nicht.

Ist das generell so trotzdem der richtige Ansatz oder ist das Murcks?
Hab ich ich aus einem Tutorial und weiß nicht wie ich das bewerten soll...
 

LouCyphre

Bekanntes Mitglied
Habs jetzt erstmal so zu Testzwecken "hinbekommen".

Java:
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import java.io.*;

class Scratch {
    public static void main(String[] args) {

        Scratch scratch = new Scratch();
        scratch.readQuestion();

    }
    public void readQuestion() {
        InputStream questionFile = Scratch.class.getResourceAsStream("questions.json");

        JsonElement questionElement = JsonParser.parseReader(new InputStreamReader(questionFile));
        JsonObject questionObject = questionElement.getAsJsonObject();

        JsonArray jsonArrayOfQuestions = questionObject.get("questions").getAsJsonArray();

        for (JsonElement qElement : jsonArrayOfQuestions){
            JsonObject qJsonObject = qElement.getAsJsonObject();

            String question = qJsonObject.get("question").getAsString();
            System.out.println(question);


        }

    }
}

Das File scheint er erstmal einzulesen. Bekomme nur Fehler für den JSON Syntax

EDIT: Jetzt klappt es auch. Der Built war noch Schuld. Rebuild hats gebracht.
 
Zuletzt bearbeitet:

LouCyphre

Bekanntes Mitglied
OK, das ist eine andere Baustelle.
Richtig.

Ich würde dann nämlich gern sowas machen

Java:
//...

 String question = qJsonObject.get("question").getAsString();
            List<String> answers = new ArrayList<>();
            answers = qJsonObject.get("answers").getAsList(); // getasList() gibts nicht
                                                              // hab ich mir nur gewünscht

            Card card = new Card(question, answers);

Die Frage ist jetzt noch, wie bekomme ich answers im .json zu einer Liste formatiert?
 

mihe7

Top Contributor
JSON:
{
  "question": "Wie viele Ecken hat ein Quadrat?"
  "answers": [
      "Eine", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht"
  ]
}
 

mrBrown

Super-Moderator
Mitarbeiter
getAsJsonArray nutzen, dann bekommt du ein JsonArray. Über dieses dann iterieren, und mit get und getAsString die einzelnen Elemente als String holen und mit diesen dann eine passende Liste füllen.
 

Oneixee5

Top Contributor
So ein rumgedaddel mit JSON-Objekten ist gar nicht nötig:
Java:
public class JsonTest {

    private static class Question {

        private String question;
        private String[] answers;

        public String getQuestion() {
            return this.question;
        }
        public void setQuestion(final String question) {
            this.question = question;
        }
        public String[] getAnswers() {
            return this.answers;
        }
        public void setAnswers(final String[] answers) {
            this.answers = answers;
        }

    }

    public static void main(final String[] args) throws NumberFormatException, IOException {
        final String json = """
                {
                  "question": "Wie viele Ecken hat ein Quadrat?",
                  "answers": [
                      "Eine", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht"
                  ]
                }
                """;
        final ObjectMapper mapper = new ObjectMapper();
        final Question question = mapper.readValue(json, Question.class);

        System.out.println(question.getQuestion());

        final BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
        final int n = Integer.parseInt(r.readLine());
        System.out.println(question.getAnswers()[n-1]);
    }

}
 

Oneixee5

Top Contributor
Java:
public class JsonTest {

...
import com.fasterxml.jackson.databind.ObjectMapper;
...

    public static final class Questions {

        private List<Question> questions;

        public List<Question> getQuestions() {
            return this.questions;
        }

        public void setQuestions(final List<Question> questions) {
            this.questions = questions;
        }

    }

    private static class Question {

        private String question;
        private String[] answers;

        public String getQuestion() {
            return this.question;
        }
        public void setQuestion(final String question) {
            this.question = question;
        }
        public String[] getAnswers() {
            return this.answers;
        }
        public void setAnswers(final String[] answers) {
            this.answers = answers;
        }

    }

    public static void main(final String[] args) throws NumberFormatException, IOException {
        final String json = """
                {
                    "questions":[
                        {
                            "question": "Wie viele Ecken hat ein Quadrat?",
                            "answers": [ "Eine", "Zwei", "Drei", "Vier", "Fünf", "Sechs", "Sieben", "Acht" ]
                        },
                        {
                            "question": "Was ist kein Buchstabe? 1: A, 2: 99, 3: Q ",
                            "answers" : [ "falsch", "richtig", "falsch" ]
                          }

                    ]
                }
                """;
        final ObjectMapper mapper = new ObjectMapper();
        final Questions questions = mapper.readValue(json, Questions.class);

        try (BufferedReader r = new BufferedReader(new InputStreamReader(System.in))) {
            for (final Question question : questions.getQuestions()) {
                System.out.println(question.getQuestion());
                final int n = Integer.parseInt(r.readLine());
                System.out.println(question.getAnswers()[n-1]);
            }
        }
    }

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
L JSON auslesen und Labels in GUI verwenden XML & JSON 13
mananana Frage zu JSON XML & JSON 3
wofus JSON filtern nach bestimmten Wert XML & JSON 7
N JSON export String Unicode? XML & JSON 6
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
M json page 2 auslesen XML & JSON 1
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 Json auslesen XML & JSON 7
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
Shoox XML Reader XML & JSON 13

Ähnliche Java Themen

Neue Themen


Oben