Wie analysiert JSON eine toString-Ausgabe ?

MarcoJ75

Neues Mitglied
Hallo,
ich habe mal wieder eine Verständnisfrage,diesmal zu JSON. Hier erstmal der Code:


Java:
package K26;
import org.json.JSONObject;
public class SimpleVokabelJson {
public static void main(String[] args) {
        JSONObject jobj = new JSONObject();
        jobj.put("frage", "Buch");
        jobj.put("antwort", "book");
        jobj.put("fachnr", new Integer(2));
        String jsonString = jobj.toString();
        System.out.println(jsonString);
        // Ausgabe: {"frage":"Buch","fachnr":2,"antwort":"book"}

        JSONObject jvok = new JSONObject(jsonString);
        Vokabel vok = new Vokabel();
        vok.setFrage(jvok.getString("frage"));
        vok.setAntwort(jvok.getString("antwort"));
        vok.setFachnr(jvok.getInt("fachnr"));
        System.out.println(vok);

Java:
package K26;
import org.json.JSONObject;
public class Vokabel {
    private String antwort;
    private int fachnr = 1;
    private String frage;
    private Datum zuletzt = new Datum();

    public Vokabel() {
    }

    public Vokabel(JSONObject obj) {
        this.frage = obj.getString("frage");
        this.antwort = obj.getString("antwort");
        this.fachnr = obj.getInt("fachnr");
        this.zuletzt = new Datum((JSONObject) obj.get("zuletzt"));
    }

    public String getAntwort() {
        return antwort;
    }

    public int getFachnr() {
        return fachnr;
    }

    public String getFrage() {
        return frage;
    }

    public Datum getZuletzt() {
        return zuletzt;
    }

    public void setAntwort(String antwort) {
        this.antwort = antwort;
    }

    public void setFachnr(int fachnr) {
        this.fachnr = fachnr;
    }

    public void setFrage(String frage) {
        this.frage = frage;
    }

    public void setZuletzt(Datum zuletzt) {
        this.zuletzt = zuletzt;
    }


    @Override
    public String toString() {
        return frage + "/" + antwort + "(" + fachnr + ")" + "[" + zuletzt.getTag() + "." + zuletzt.getMonat() + "."
                + zuletzt.getJahr() + "]";
    }
}

Wie man sieht, wird ein JSON-Objekt angelegt, das dann mit 3 Attributen + zugehörigen Werten gefüllt wird. Die toString-Methode des JSON-Objektes wird dann in einen String gespeichert,der dann ausgegeben wird: {"frage":"Buch","fachnr":2,"antwort":"book"}
Soweit auch noch verständlich.

Im 2.Block wird ein weiteres JSON-Objekt angelegt, das mit der toString-Ausgabe des 1.JSON-Objektes gefüttert wird. Aus diesem werden dann die Objektvariablen eines Vokabel-Objektes ermittelt. Nur: wie macht Java das,d.h. woher weiß das JSON-Objekt welcher Teil dieses Strings die Attribute und Werte sind,die in die Objektvariablen des Vokabelobjektes kopieren muss ? Wenn ich mir den Konstruktor der JSON-Klasse anschaue, der ein String empfängt,so sieht der so aus:

public JSONObject(String source) throws JSONException {
this(new JSONTokener(source));
}


Wenn ich mir den Konstruktor des JSONTokener anschaue,der den String ebenfalls empfängt, dann sieht der so aus:

public JSONTokener(String s) {
this(new StringReader(s));
}


Und der Stringreader enthält das hier:
public StringReader(String s) {
this.str = s;
this.length = s.length();
}


D.h. ich sehe nirgendwo eine Stelle, wo die toString-Ausgabe des 1.JSON-Objektes analysiert wird: {"frage":"Buch","fachnr":2,"antwort":"book"}

Wie findet Java raus, welcher Teil des Strings die Werte sind, die es in das Vokabelobjekt übergeben muss ?

Kurze Anmerkung: es gibt noch eine Klasse Datum, in der ein Datum drinsteht, wann das buch zuletzt verliehen wurde. Daher stammen die Getter getTag, getMonat, getJahr.
 
Dann musst Du weiter schauen, denn der folgende Code:
Code:
public JSONTokener(String s) {
  this(new StringReader(s));
}
ist ja ein Aufruf des Konstruktors JSONTokener mit eben dem new erstellten StringReader als Argument.
(Das ist dann der Konstruktor, der den Reader entgegen nimmt!)

Und ebenso musst Du natürlich auch schauen, was im JSONObject erfolgt, denn der Code, der von dir gezeigt wurde, zeigt ja nur, dass der Konstruktor einen anderen Konstruktor aufruft:

Code:
public JSONObject(String source) throws JSONException {
  this(new JSONTokener(source));
}

Das erste ist relativ unspektakulär - da geht es halt nur um das lesen des Strings in Form von einzelnen Token. Das was Dich interessiert ist wohl der Konstruktor vom JSONObject, welches einen JSONTokener entgegen nimmt.
 

Zurück
Oben