Nested JSON in Java ansprechen [Wordpress Rest Api]

chelayos

Mitglied
Pro JSONObjekt erstelle ich eine Map. Jedoch bei "replies" funktioniert dies nicht. Ich vermute, dies liegt daran, weil es ein JSONArray ist. Siehe dazu [Bild]: generiertes JSON von WP-API.

Java:
     String url = "https://studyhard.tk/wp-json/wp/v2/posts/"+id+"?_embed=1";

        final StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                gson = new Gson();

                mapPost = (Map<String, Object>) gson.fromJson(s, Map.class);
                mapTitle = (Map<String, Object>) mapPost.get("title");
                mapContent = (Map<String, Object>) mapPost.get("content");
                map_embedded = (Map<String, Object>) mapPost.get("_embedded");

                // Do we have replies?
                if(map_embedded.containsKey("replies"))
                {
                    map_replies = (Map<String, Object>) map_embedded.get("replies"); // Error
                }

map_replies = Map<String, Object>
map_replies = Map<String, Array>
map_replies = Map<String, ArrayList>
map_replies = Map<String, ArrayList<Object>>
map_replies = Map<String, ArrayList<JSONObject>>
map_replies = Map<String, JSONArray>
map_replies = Map<String, List<Object>>
map_replies = Map<String, List<JSONObject>>
map_replies = Map<String, List<JSONArray>>
Ist dies überhaupt möglich mit Map? Oder kennt ihr einen besseren Datentyp, damit ich auf "replies" zugreifen kann?
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn du eh GSON nutzt, bau dir das JSON-Objekt als normales Java-Objekt nach.

also etwa:
Java:
class Post {//Namen und Typen etwas geraten...
int id;
LocalDateTimt date;
//...
Embedded _embedded;
}

class Embedded {//Namen und Typen etwas geraten...
List<Author> author;
List<Reply> replies;//wenn da Liste passt, uU List<List<...>>?
//...
}

Ansonsten, "replies" ist eine Liste, keine Map
 
Zuletzt bearbeitet:

chelayos

Mitglied
Das Problem ist, ich kann nur Klassen mit "Object" machen:

Java:
public class WPPost {
    public Object id;
    public Object title;
}

Wenn ich int id oder string title verwende stürzt es ab.
Code:
FATAL EXCEPTION: main
                                                                      Process: tk.studyhard.android, PID: 15861
                                                                      com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 11

Wenn ich nun den Titel als Object ausgebe
Java:
wp = (WPPost) gson.fromJson(s, WPPost.class);
content.loadData(wp.title.toString(),"text/html; charset=UTF-8", null);
kommt das:
{rendered=Willkommen bei Wordpress}
Aber ich benötige nur den Teil Willkommen bei Wordpress
 

mrBrown

Super-Moderator
Mitarbeiter
Oder das Objekt passend nachbauen. Titel zB ist kein String, sondern ein Objekt, welches du dann auch repräsentieren müsstest.
 

chelayos

Mitglied
Mit einer gewöhnlichen ArrayList (ohne Map) scheint es zu funktionieren.
Java:
// Do we have replies?
                if(map_embedded.containsKey("replies"))
                {
                    map_replies = (ArrayList) map_embedded.get("replies");
                    content.loadData(map_replies.toString(), "text/html; charset=UTF-8", null);
                }

Code wurde ebenfalls auf Github aktualisiert.

der Output:
t1.png


Ich benötige folgende Felder:
  • content
  • author_name
  • date
Gibts da nen besseren Weg als einfach die ganze Arraylist abzusuchen?
Ich habe weiter oben im Code Maps verwendet, weil das beim Postcontent so einfach ging:
mapContent.get("rendered").toString();
So wird nur der Inhalt ohne das {rendered=} ausgegeben. Gibts sowas ähnlcihes auch bei Arraylist?

@RalleYTN , @mrBrown Danke für eure Mitarbeit!
@mrBrown wie meinst du ein Objekt nachbauen / repräsentieren? Sorry steh grad aufm Schlauch. Evtl Beispiel wäre gut^^
 
Zuletzt bearbeitet:

chelayos

Mitglied
Habe nun deinen Rat befolgt und habe Klassen erstellt:

Java:
public class WPPost {
    Map<String, Object> title;
    Map<String, Object> content;
    Embedded _embedded;
}

Java:
public class Embedded
{
    //Object[] replies;
//Object replies
    //ArrayList<Reply>[] replies;
//Arraylist<Reply> replies;
//List<Reply> replies;
    List<Reply>[] replies;
}

Java:
public class Reply
//Map<String, Object> author_name;
    //Map<String, Object> date;
    //Map<String, Object> content;
    String author_name;
    String date;
    String content;

Im Code kann ich nun bis zu _embedded zugreifen. Aber ich werde aber nicht schlau draus, wie es nun weiter gehen soll. Klar ich muss ich replies als Klasse nachbauen aber das funktioniert bis jetzt noch nicht. Habe verschiedene Dateitypen versucht (auch mit []) aber ich krieg nur Fehler oder Count: 0, wenn ich items zähle.
reply.png
 

mrBrown

Super-Moderator
Mitarbeiter
Dann zeig doch mal die Fehlermeldung, die du bei welchem DatenTyp bekommst.

Entweder List<Reply> oder List<List<Reply>> müsste passen (sieht zumindest in dem Screenshot so aus...)
 

mrBrown

Super-Moderator
Mitarbeiter
Guck dir einfach mal die Rückgagetypen bzw die Objekte selbst an, daraus und aus der Exception sollte das eig klar werden ;)

Generell, wenn du bei sowas casten musst ist was falsch gelaufen ;)
 

chelayos

Mitglied
Bin nun soweit, dass Kommentare dargestellt werden :D*Freudensprung*
output.png


Ich habe das Datum auf das deutsche Format dd.MM.yy umgewandelt. Sieht mir persönlich aber zu kompliziert aus. Macht man das so in Java oder geht das doch einfacher?

Java:
   String content = "";

                SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
                SimpleDateFormat formatter2 = new SimpleDateFormat("dd.MM.yy");

                for (Replies r : wp._embedded.replies[0])
                {
                    try
                    {
                        content += formatter2.format(formatter1.parse(r.date));
                    }
                    catch(ParseException e)
                    {
                        //invalid date
                    }
                    content += " " + r.author_name + ": ";
                    content += r.content.get("rendered");
                }
                content= content.replaceAll("<p>", "");
 

VfL_Freak

Top Contributor
Moin,
Ich habe das Datum auf das deutsche Format dd.MM.yy umgewandelt. Sieht mir persönlich aber zu kompliziert aus
Wieso kompliziert ??

Macht man das so in Java oder geht das doch einfacher?
Was genau ist bei r.date das date??
Nutzt Du Java8 oder ist hier noch das als depricated gekennzeichnete date der älteren Version im Einsatz?

Aber setz' dich ggf. mal mit der LIB JodaTime auseinander, die ist deutlich komfortabler !
http://www.joda.org/joda-time/

Gruß Klaus
 

mrBrown

Super-Moderator
Mitarbeiter
Nutzt Du Java8 oder ist hier noch das als depricated gekennzeichnete date der älteren Version im Einsatz?
Date ist nicht Deprecated.
___

Am einfachsten wäre, den Feldern passende Datentypen zu geben (nicht String für ein Datum!), und dem GSON-Parser den passenden DateFormatter zuzuweisen, dann musst du's nur noch einmalig für die Ausgabe parsen.
 

VfL_Freak

Top Contributor
Aber gerne doch :)

Geh' links oben auf java.util, dann unten auf Date ....
Da sind dann alle (bis einen) Konstruktoren depricated, und das Gros der Methoden !

Gruß Klaus
 

mrBrown

Super-Moderator
Mitarbeiter
Date als ganzes ist (noch?) nicht deprecated, aber dafür jede zweite Methode davon, was meiner Meinung nach ein gutes Indiz gegen die Nutzung davon ist.
Die sinds auch schon seit einigen JDK-Versionen (min 1.5, und seit 1.1 gibts zumindest Ersatz dafür), deshalb würd ich erstmal nicht davon ausgehen, dass es so schnell kommt, auch wenn ich sehr dafür wäre, wenn es eher heute als morgen passiert ;)


Sinnvoll wäre es hier auf jeden Fall, da LocalDate zu benutzen (wenn das nicht also komplex ist, GSON das beizubringen...)
 

VfL_Freak

Top Contributor
Die sinds auch schon seit einigen JDK-Versionen (min 1.5, und seit 1.1 gibts zumindest Ersatz dafür), deshalb würd ich erstmal nicht davon ausgehen, dass es so schnell kommt, auch wenn ich sehr dafür wäre, wenn es eher heute als morgen passiert ;)
richtig, des wegen wollte ich anfangs auch "Versionen" schreiben - das "en" am Ende ist wohl bei der Wärme weggeschmolzen :D

Wie nutzen hier seit längerem nur noch das oben erwähnte JodaTime, was IMHO wesentlich eleganter ist!

Allerdings es seit Java8 ja eine ganz neue Klasse, die ich aber auch noch nicht ausprobiert habe ...
http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
https://kevcodez.de/index.php/2015/07/java-8-date-und-time-api-neue-datumsfunktionen/

Gruß Klaus
 

mrBrown

Super-Moderator
Mitarbeiter
Wie nutzen hier seit längerem nur noch das oben erwähnte JodaTime, was IMHO wesentlich eleganter ist!

Allerdings es seit Java8 ja eine ganz neue Klasse, die ich aber auch noch nicht ausprobiert habe ...
http://www.oracle.com/technetwork/articles/java/jf14-date-time-2125367.html
https://kevcodez.de/index.php/2015/07/java-8-date-und-time-api-neue-datumsfunktionen/
Die neue Date-API ist ja auch nach JodaTime-Vorbild entstanden, dürfte also ähnlich gut zu benutzen sein, und hat zusätzlich den Vorteil, das es zur Standard-API gehört ;)
 

chelayos

Mitglied
Wieso kompliziert ??
Weil ich 5 Zeilen brauche, nur um das Datum ins richtige Format zu bringen xD
Was genau ist bei r.date das date??
Das Feld date im JSON ist ein String. Beispiel:
"2016-03-15T02:25:15"
Ich habe ehrlich gesagt keine Ahnung. Ich verwende das neueste AndroidStudio mit der neuesten SDK (Android 7). JAVA/Android ist neu für mich. Komme eigentlich aus der C# Ecke.
hat zusätzlich den Vorteil, das es zur Standard-API gehört
Genau, deswegen könnte ich mir dies eher vorstellen zu benutzen. Ich möchte eigentlich keine/wenige Bibliotheken einsetzen, damit meine Androidapp nicht so gross wird.

Noch ne allgemeine Frage. Ich habe vor z.B. oben links ein Menü zu integrieren mit Kategorien (von Wordpress). Ich habe sehe da folgende Möglichkeiten:

1) Hardkodieren / feste URLs setzen. Spart Zeit, da wenig Programmieraufwand. Ressourcenschonend. App startet schneller, da 1x Request weniger gesendet / geparst werden musst. Aber ich muss die App früher oder später anpassen, wenn es neue Kategorien gibt.

2.) Kategorien von Wordpress abgreifen. Somit müsste ich meine App nie wieder ändern.
Aber dann muss bei jedem Appstart noch die Kategorien via Request geholt werden.

3.) Die Premiumvariante währe wohl 2) mit Caching. z.B. 1x täglich bei Wordpress nachfragen, obs neue Kategorien gibt.
 

mrBrown

Super-Moderator
Mitarbeiter
Weil ich 5 Zeilen brauche, nur um das Datum ins richtige Format zu bringen xD
Naja, eigentlich sinds nur 3 Zeilen, und mit passend konfiguriertem GSON sinds drei (bzw eine), kompliziert ist das noch nicht, wenig Zeilen sind selten besser als viele ;)

Das Feld date im JSON ist ein String. Beispiel:
"2016-03-15T02:25:15"
Lass wie gesagt GSON daraus ein Date machen, dann sparst du dir das.

Ich habe ehrlich gesagt keine Ahnung. Ich verwende das neueste AndroidStudio mit der neuesten SDK (Android 7). JAVA/Android ist neu für mich. Komme eigentlich aus der C# Ecke.
Genau, deswegen könnte ich mir dies eher vorstellen zu benutzen. Ich möchte eigentlich keine/wenige Bibliotheken einsetzen, damit meine Androidapp nicht so gross wird.

Dann fällt die Java 8-API weg, du wirst also entweder mit dem echt unschönen Date arbeiten müssen, oder externe libs einbinden müssen. JodaTime sollte nicht allzu groß sein.


Noch ne allgemeine Frage. Ich habe vor z.B. oben links ein Menü zu integrieren mit Kategorien (von Wordpress). Ich habe she da folgende Möglichkeiten:

1) Hardkodieren / feste URLs setzen. Spart Zeit, da wenig Programmieraufwand. Ressourcenschonend. App startet schneller, da 1x Request weniger gesendet / geparst werden musst. Aber ich muss die App früher oder später anpassen, wenn es neue Kategorien gibt.

2.) Kategorien von Wordpress abgreifen. Somit müsste ich meine App nie wieder ändern.
Aber dann muss bei jedem Appstart noch die Kategorien via Request geholt werden.

3.) Die Premiumvariante währe wohl 2) mit Caching. z.B. 1x täglich bei Wordpress nachfragen, obs neue Kategorien gibt.

Das ganze hinter einem Interface verpacken mit passende Factory z.B., dann kann man es erstmal hardcoded machen, und nachher immernoch an 2) oder 3) anpassen
 

Thallius

Top Contributor
Ist das nicht ziemliches POITROAE was Du da machst? Check doch erst einmal wie lange die Abfrage der Kategorien dauert. Weiterhin wäre die Premiumvariante eigentlich

Neustart der App:

Menu ist leer. Du startest einen Background-Task. Dieser holt die Kategorien und setzt sie ins Menu und speichert sie in einer propeties datei.

alle weiteren Starts:

Laden der Menus aus der property Datei und anzeigen. Gleichzeitig im Background Task die Kategorien holen und wenn fertig in property datei speichern und menu aktualiseren.

Das ist auch nicht wirklich schwer zu implementieren.

Gruß

Claus
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
looparda Nested Predicate Allgemeine Java-Themen 6
L Klassen Nested Class In Nested Class Allgemeine Java-Themen 3
D nested loops mit Iterator Allgemeine Java-Themen 2
Pastafari Iterator über nested HashMaps Allgemeine Java-Themen 7
woezelmann referenz der outer class aus static nested class heraus Allgemeine Java-Themen 7
B warum keine nested blocks Allgemeine Java-Themen 2
G Problemem mit <nested:select . Allgemeine Java-Themen 2
J Verständnisfrage - nested static classes Allgemeine Java-Themen 11
M JSON Parsing von youtube video comment replies Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
O JSON in Integer parsen Allgemeine Java-Themen 5
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
G Json POST-REQUEST Allgemeine Java-Themen 14
J json Array würfel Spalten durcheinander Allgemeine Java-Themen 9
Mario1409 Methoden JSON Array von URL Allgemeine Java-Themen 8
D JSON to String Allgemeine Java-Themen 31
K Große JSON-Dateien schnell und effizient verarbeiten Allgemeine Java-Themen 16
F Json in sql speichern und lesen Allgemeine Java-Themen 10
F Alte Passörter mit Gson und Json in SQL speichern? Allgemeine Java-Themen 5
J Frage zum Entwurf / json-Datenmodell Allgemeine Java-Themen 8
2 mehrere Json Werte Parsen Allgemeine Java-Themen 3
agent47 JSON verarbeiten Allgemeine Java-Themen 4
G JSON parsen Allgemeine Java-Themen 3
Thallius Simple JSON Parser Error null Allgemeine Java-Themen 6
J Java JSON-Datei aus .Zip auslesen und Download mit Progress Bar Allgemeine Java-Themen 20
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
M Changelog aus JSON Allgemeine Java-Themen 2
M JSON NullPointerException Allgemeine Java-Themen 5
B json zu java class Allgemeine Java-Themen 2
F Java Restapi JSON Allgemeine Java-Themen 5
G Json-Lib NoClassDefFoundError Allgemeine Java-Themen 3
O JSON String bauen aus Liste Allgemeine Java-Themen 2
O Vorteile von GSON ggü. JSON "per Hand" Allgemeine Java-Themen 4
O JSON: ClassNotFound Allgemeine Java-Themen 8
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
J Lucene suche in Json (CouchDB) Allgemeine Java-Themen 2
K Regex JSON Allgemeine Java-Themen 3
G JSON Object auslesen Allgemeine Java-Themen 1
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
N LlaMA, KI, java-llama.cpp Allgemeine Java-Themen 39
V Java-Codierungsherausforderung: Navigieren durch die Macken der Datumsmanipulation Allgemeine Java-Themen 2
E Output Fehler (Java-Programm Kuchen) Allgemeine Java-Themen 11
M java: unexpected type Allgemeine Java-Themen 2
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Java Discord bot auf ein Root Server? Allgemeine Java-Themen 1
BetziTheRealOne Java PKIX path building failed as non Admin Allgemeine Java-Themen 15
D Linux, Java-Version wird nicht erkannt bzw. welche Einstellung fehlt noch? Allgemeine Java-Themen 19
KonradN Java 21 Release Allgemeine Java-Themen 5
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
P Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main Allgemeine Java-Themen 24
K Java Anwendung machen Anleitung Allgemeine Java-Themen 5
G java.io.listFiles() Allgemeine Java-Themen 3
8u3631984 Frage zu Java Streams min / max Allgemeine Java-Themen 17
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
K Java-Projekt Allgemeine Java-Themen 11
K Java-Projekt Allgemeine Java-Themen 0
ruutaiokwu Welcher Browser unterstützt heutzutage noch Java Applets? Allgemeine Java-Themen 5
Jose05 Java-Klasse im extra cmd-Fenster ausführen Allgemeine Java-Themen 3
rode45e Java Threads Allgemeine Java-Themen 4
G java.io.listFiles() Allgemeine Java-Themen 2
N Java Dynamic Proxy Allgemeine Java-Themen 3
N Leichte Java Gegner Ki Allgemeine Java-Themen 10
A Java modul Problem Allgemeine Java-Themen 4
Thomasneuling Java Jar datei erstellen, von Projekt, dass auch Javafx Dateien, FXML Dateien und CSS Dateien, sowie Bilder enthält? Allgemeine Java-Themen 14
V Funktionale Schnittstelle in Java Allgemeine Java-Themen 3
OnDemand Java String in Hashmap als Key NULL Allgemeine Java-Themen 27
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
berserkerdq2 Wenn ich bei Intelij javafx mit maven importieren will, muss ich das in die pom.xml reintun, aber warum noch in module-info.java? Allgemeine Java-Themen 3
KonradN Java 20 am 21. März Allgemeine Java-Themen 1
O Java Website Stock Bot Allgemeine Java-Themen 3
J Front-/Backend in Java Allgemeine Java-Themen 14
doopexxx JAVA Google Webcrawler Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
A Java Programm erstellen hilfe Allgemeine Java-Themen 10
G java.lang.NoClassDefFoundError: org/aspectj/lang/Signature Allgemeine Java-Themen 2
lalex1491 Java Aktienkurse nachfragen Allgemeine Java-Themen 4
J Class to link Java Allgemeine Java-Themen 4
V Wie funktioniert das Schlüsselwort "final" von Java? Allgemeine Java-Themen 19
mrStudent Inferenz JAVA Allgemeine Java-Themen 6
U URI Rechner (Java Script) Allgemeine Java-Themen 7
TheSkyRider Java Geburtsdatum Textfeld Allgemeine Java-Themen 7
mihe7 Java 19 JavaDocs: Browserintegration Allgemeine Java-Themen 0
Encera Gleichzeitiges Ausführen und verbinden von 2 Java-Klassen über die Eingabeaufforderung und Eclipse Allgemeine Java-Themen 21
H Java Rechner Programmierung der Mathematik Allgemeine Java-Themen 33
Lennox Schinkel Java Kara Auf einen Java Host laufen lassen Allgemeine Java-Themen 17
C Fußnoten von DocX mit Java Allgemeine Java-Themen 2
C Fußnoten in DocX mit Java Allgemeine Java-Themen 1
M Aussagenlogik in Java Programmieren Allgemeine Java-Themen 22
B Per Java Word Dokument schreiben? Allgemeine Java-Themen 8
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
KonradN Oracle übergibt (Java Teile der) GraalVM Community Edition an OpenJDK Community Allgemeine Java-Themen 2
Momo16 Brauche Hilfe - Java Projekt kann nicht erstellt werden Allgemeine Java-Themen 12
B Java mit command line und jars benutzen? Allgemeine Java-Themen 18
M Java Überprüfen ob .exe-Datei bereits ausgeführt wird Allgemeine Java-Themen 2
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
Mick P. F. Wie kriege ich die Fehlermeldung "java: symbol lookup error: ..." weg? Allgemeine Java-Themen 11
K Nachhilfe Java Allgemeine Java-Themen 11

Ähnliche Java Themen

Neue Themen


Oben