Jackson JSON parsen

Luckshotx

Mitglied
Hallo,

derzeit versuche ich mit Jackson eine API im JSON Format zu parsen. Wenn ich das ganze im kleinen Rahmen versuche schaffe ich es erfolgreich auf einzelne Daten zuzugreifen. Wenn das Ganze nun komplexer wird und Werte doppelt vorkommen komme ich leider nicht mehr zurecht. Verwendet habe ich Jackson und jsonschema2pojo.

Ich würde euch bitten, mir an einem kleinen Beispiel zu zeigen, wie ich an bestimmte Daten herankomme, in meinem Fall würde ich gerne den Bereich mit der id 49479 mit allen relevanten Daten, wie z.B. dem Slot und den Attributen ausgeben. Ein Denkanstoß wäre natürlich auch super oder verlinkt mir gerne auch leicht verständliche Anleitungen dazu.
Leider weiß ich dort überhaupt nicht, wie ich nun die einzelnen Klassen anspreche um an die relevanten Daten zukommen, aber schaut euch dazu am besten mal meinen Ansatz an. Die meisten Anleitungen haben leider nur die leichte Fälle behandelt.

Code:
{
  "equipment": [
    {
      "id": 63473,
      "slot": "HelmAquatic",
      "binding": "Character",
      "bound_to": "User123"
    },
    {
      "id": 49479,
      "slot": "Backpack",
      "stats": {
        "id": 584,
        "attributes": {
          "Power": 63,
          "Precision": 40,
          "CritDamage": 40
        }
      },
      "binding": "Account"
    },
    {
      "id": 48073,
      "slot": "Coat",
      "binding": "Account"
    },
    {
      "id": 48072,
      "slot": "Boots",
      "binding": "Account"
    },
    {
      "id": 48074,
      "slot": "Gloves",
      "binding": "Account"
    },
    {
      "id": 48075,
      "slot": "Helm",
      "binding": "Account"
    },
    {
      "id": 48076,
      "slot": "Leggings",
      "binding": "Account"
    },
    {
      "id": 48077,
      "slot": "Shoulders",
      "binding": "Account"
    },
    {
      "id": 39232,
      "slot": "Accessory1",
      "binding": "Account"
    },
    {
      "id": 39233,
      "slot": "Accessory2",
      "binding": "Account"
    },
    {
      "id": 75669,
      "slot": "Ring1",
      "binding": "Account"
    },
    {
      "id": 76024,
      "slot": "Ring2",
      "binding": "Account"
    },
    {
      "id": 39272,
      "slot": "Amulet",
      "binding": "Account"
    },
    {
      "id": 14661,
      "slot": "WeaponAquaticA",
      "upgrades": [
        24618,
        24612
      ],
      "binding": "Character",
      "bound_to": "User123"
    },
    {
      "id": 30704,
      "slot": "WeaponA1",
      "upgrades": [
        24599
      ],
      "stats": {
        "id": 161,
        "attributes": {
          "Power": 251,
          "Precision": 179,
          "CritDamage": 179
        }
      },
      "binding": "Account"
    },
    {
      "id": 14443,
      "slot": "WeaponB1",
      "skin": 5209,
      "binding": "Character",
      "bound_to": "User123"
    },
    {
      "id": 22997,
      "slot": "Sickle",
      "binding": "Account",
      "charges": 32
    },
    {
      "id": 23000,
      "slot": "Axe",
      "binding": "Account",
      "charges": 33
    },
    {
      "id": 23001,
      "slot": "Pick",
      "binding": "Account",
      "charges": 63
    }
  ]
}

Code:
import java.net.URL;

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {

   public static void main(String[] args) throws Exception {              
       URL equipmentURL = new URL("https://api.guildwars2.com/v2/characters/User123/equipment?access_token=8B436065-E98A-924C-803D");
       
       Example example = null;
       example = mapper.readValue(equipmentURL, Example.class);
       
       System.out.println(example.getEquipment());
   }
}

Code:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "equipment"
})
public class Example {

    @JsonProperty("equipment")
    private List<Equipment> equipment = null;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("equipment")
    public List<Equipment> getEquipment() {
        return equipment;
    }

    @JsonProperty("equipment")
    public void setEquipment(List<Equipment> equipment) {
        this.equipment = equipment;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

Code:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "id",
    "slot",
    "binding",
    "bound_to",
    "stats",
    "upgrades",
    "skin",
    "charges"
})
public class Equipment {

    @JsonProperty("id")
    private Integer id;
    @JsonProperty("slot")
    private String slot;
    @JsonProperty("binding")
    private String binding;
    @JsonProperty("bound_to")
    private String boundTo;
    @JsonProperty("stats")
    private Stats stats;
    @JsonProperty("upgrades")
    private List<Integer> upgrades = null;
    @JsonProperty("skin")
    private Integer skin;
    @JsonProperty("charges")
    private Integer charges;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("id")
    public Integer getId() {
        return id;
    }

    @JsonProperty("id")
    public void setId(Integer id) {
        this.id = id;
    }

    @JsonProperty("slot")
    public String getSlot() {
        return slot;
    }

    @JsonProperty("slot")
    public void setSlot(String slot) {
        this.slot = slot;
    }

    @JsonProperty("binding")
    public String getBinding() {
        return binding;
    }

    @JsonProperty("binding")
    public void setBinding(String binding) {
        this.binding = binding;
    }

    @JsonProperty("bound_to")
    public String getBoundTo() {
        return boundTo;
    }

    @JsonProperty("bound_to")
    public void setBoundTo(String boundTo) {
        this.boundTo = boundTo;
    }

    @JsonProperty("stats")
    public Stats getStats() {
        return stats;
    }

    @JsonProperty("stats")
    public void setStats(Stats stats) {
        this.stats = stats;
    }

    @JsonProperty("upgrades")
    public List<Integer> getUpgrades() {
        return upgrades;
    }

    @JsonProperty("upgrades")
    public void setUpgrades(List<Integer> upgrades) {
        this.upgrades = upgrades;
    }

    @JsonProperty("skin")
    public Integer getSkin() {
        return skin;
    }

    @JsonProperty("skin")
    public void setSkin(Integer skin) {
        this.skin = skin;
    }

    @JsonProperty("charges")
    public Integer getCharges() {
        return charges;
    }

    @JsonProperty("charges")
    public void setCharges(Integer charges) {
        this.charges = charges;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

Code:
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "Power",
    "Precision",
    "CritDamage"
})
public class Attributes {

    @JsonProperty("Power")
    private Integer power;
    @JsonProperty("Precision")
    private Integer precision;
    @JsonProperty("CritDamage")
    private Integer critDamage;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("Power")
    public Integer getPower() {
        return power;
    }

    @JsonProperty("Power")
    public void setPower(Integer power) {
        this.power = power;
    }

    @JsonProperty("Precision")
    public Integer getPrecision() {
        return precision;
    }

    @JsonProperty("Precision")
    public void setPrecision(Integer precision) {
        this.precision = precision;
    }

    @JsonProperty("CritDamage")
    public Integer getCritDamage() {
        return critDamage;
    }

    @JsonProperty("CritDamage")
    public void setCritDamage(Integer critDamage) {
        this.critDamage = critDamage;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}

Code:
import java.util.HashMap;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    "id",
    "attributes"
})
public class Stats {

    @JsonProperty("id")
    private Integer id;
    @JsonProperty("attributes")
    private Attributes attributes;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonProperty("id")
    public Integer getId() {
        return id;
    }

    @JsonProperty("id")
    public void setId(Integer id) {
        this.id = id;
    }

    @JsonProperty("attributes")
    public Attributes getAttributes() {
        return attributes;
    }

    @JsonProperty("attributes")
    public void setAttributes(Attributes attributes) {
        this.attributes = attributes;
    }

    @JsonAnyGetter
    public Map<String, Object> getAdditionalProperties() {
        return this.additionalProperties;
    }

    @JsonAnySetter
    public void setAdditionalProperty(String name, Object value) {
        this.additionalProperties.put(name, value);
    }

}
 

mrBrown

Super-Moderator
Mitarbeiter
Naja, eig recht einfach...
aus example die Liste getten, mit Streams oder Schleifen das Equipment mit der gesuchten ID raussuchen, und dann ausgeben, das ist ab da pures Java und hat nichts mehr mit JSON zu tun ;)

Was verstehst du denn nicht?
 

Luckshotx

Mitglied
Naja, eig recht einfach...
aus example die Liste getten, mit Streams oder Schleifen das Equipment mit der gesuchten ID raussuchen, und dann ausgeben, das ist ab da pures Java und hat nichts mehr mit JSON zu tun ;)

Was verstehst du denn nicht?

Super, vielen Dank! Das ich mit example arbeiten muss war wohl mein Stolperstein. Wie bekomme ich den nun am elegantesten raus, wie viele Einträge bei den Attributen vorhanden sind?

Einmal die Lösung für die Nachwelt:
Code:
System.out.println("Id: " + example.getEquipment().get(1).getId());
System.out.println("Slot: " + example.getEquipment().get(1).getSlot());
System.out.println("Stats:");
System.out.println("   Attributes:");
System.out.println("      Power: " + example.getEquipment().get(1).getStats().getAttributes().getPower());
System.out.println("      Precision: " + example.getEquipment().get(1).getStats().getAttributes().getPrecision());
System.out.println("      CritDamage: " + example.getEquipment().get(1).getStats().getAttributes().getCritDamage());
System.out.println("Binding: " + example.getEquipment().get(1).getBinding());
 

mrBrown

Super-Moderator
Mitarbeiter

Luckshotx

Mitglied
Wie meinst du das, wie viele Stats zu einem Equipment gehören?
Genau. Aber woher weiß ich welche Stats es eigentlich sind? Ich kann denke ich mal schlecht alle möglichen Werte durchlaufen und schauen ob ich was zurückbekomme, dann müsste wiederrum alle Fälle abgedeckt sein. Setzt natürlich voraus, dass es mehr als drei Werte gibt.

example.getEquipment().get(1).getStats().getAttributes())
Liefert mir ja nur die Adresse?

Die Lösung mit get(1) ist übrigens echt unschön, wenn du einen Eintrag mit einer bestimmten ID möchtest, was zumindest deine Frage war...
Das stimmt natürlich, hätte mir dann mit size() die Länge geholt und wäre die Liste mit einer Schleife durchlaufen.
 

mrBrown

Super-Moderator
Mitarbeiter
Genau. Aber woher weiß ich welche Stats es eigentlich sind? Ich kann denke ich mal schlecht alle möglichen Werte durchlaufen und schauen ob ich was zurückbekomme, dann müsste wiederrum alle Fälle abgedeckt sein. Setzt natürlich voraus, dass es mehr als drei Werte gibt.
Naja, doch. Wie denn sonst, als durchlaufen und gucken was da ist, soll man denn sonst sehen was da ist?

example.getEquipment().get(1).getStats().getAttributes())
Liefert mir ja nur die Adresse?

Naja, das gibt die das Attribute-Objekt, damit kannst du dann weitermachen, je nachdem was du machen willst...

Das stimmt natürlich, hätte mir dann mit size() die Länge geholt und wäre die Liste mit einer Schleife durchlaufen.
Oder die Stream-API benutzen, damit gehts deutlich einfacher ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
Optional<Equipment> equipment = example.getEquipment().stream() //Stream erzeugen
.filter(e -> e.getId().equals(49479)) //Nur das Equipment im Stream lassen, dessen ID==49479 ist
.findAny(); //ein Element zurückgeben (sollte bei IDs genau eins sein), ist in einem Optional gekapselt, da es auch keins sein kann (zb hier, wenn es die ID nicht gibt)

Mit dem optional kann man dann entsprechend weitermachen ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
BATMAN_2008 Jackson adding additional fields to JSON throws java.util.concurrent.CompletionException: Java Basics - Anfänger-Themen 2
krgewb ObjectMapper (Jackson) Java Basics - Anfänger-Themen 1
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
P Jackson mapper.readValue mit generischem Type Java Basics - Anfänger-Themen 10
I JSON in Objekt umwandeln Java Basics - Anfänger-Themen 3
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
J Objekte in JSON speichern?? Java Basics - Anfänger-Themen 1
V JSON-Objs aus JSON-Obj filtern und löschen (Manipulation ohne Kenntnis der vollst. Struktur) Java Basics - Anfänger-Themen 12
I JSON / XML Struktur mit Vererbung / Interfaces Java Basics - Anfänger-Themen 0
I API - zurückgegebener JSON String lesen und in Entity konvertieren Java Basics - Anfänger-Themen 2
I JSON - cannot deserialize from Object value Java Basics - Anfänger-Themen 16
S JSON einlesen und benutzen Java Basics - Anfänger-Themen 5
HolyFUT JSON String in Java Object schreiben - Anführungszeichen rauskriegen? Java Basics - Anfänger-Themen 17
I JSON und Interface Java Basics - Anfänger-Themen 3
J Wert in einer json Datei ändern und speichern Java Basics - Anfänger-Themen 3
J Json Datei auslesen Java Basics - Anfänger-Themen 4
J JSON-HashMap Java Basics - Anfänger-Themen 3
P JSON-Array auf Excel-Spalten verteilen? Java Basics - Anfänger-Themen 5
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
P Ressourcen für JSON & API Informationen? Java Basics - Anfänger-Themen 1
D JSON in JSOUP ELEMENTS Java Basics - Anfänger-Themen 1
M Wie analysiert JSON eine toString-Ausgabe ? Java Basics - Anfänger-Themen 1
F POST-Request mit json - Abfrage mit Java Java Basics - Anfänger-Themen 2
R Value von einem JSON-Objekt ausgeben Java Basics - Anfänger-Themen 4
S JSON Datei schreiben und lesen Java Basics - Anfänger-Themen 3
F Kann JSON nicht deserialisieren Java Basics - Anfänger-Themen 0
R JSON Array Java Basics - Anfänger-Themen 4
E Erste Schritte Wie führe ich org.json.jar aus? Java Basics - Anfänger-Themen 6
M JSON Format Java Basics - Anfänger-Themen 5
I JSON Datei in Array umwandeln Java Basics - Anfänger-Themen 1
A JSON Lesen und Schreiben. Java Basics - Anfänger-Themen 3
A JSON versenden Java Basics - Anfänger-Themen 2
N JSON - komme nicht weiter Java Basics - Anfänger-Themen 2
Y Fehler in Json Datei Java Basics - Anfänger-Themen 4
F JSON null macht mir ein Problem Java Basics - Anfänger-Themen 3
N Suchfeld, JSON Java Basics - Anfänger-Themen 2
F JSON in dokumentierten Format als PDF Java Basics - Anfänger-Themen 3
P JSON-Konfigurationsdatei verwenden: Probleme mit Pfad Java Basics - Anfänger-Themen 1
J JSON Java Basics - Anfänger-Themen 2
F JSON von XBMC Java Basics - Anfänger-Themen 1
Traxter JSON in Java Java Basics - Anfänger-Themen 15
J String aus Json File parsen Java Basics - Anfänger-Themen 6
B Best Practice JSON Datei zerlegen Java Basics - Anfänger-Themen 1
Joew0815 Interface JSON Objekte aus Java Objekten erzeugen Java Basics - Anfänger-Themen 9
C XML und/oder JSON Java Basics - Anfänger-Themen 3
J Funktion um JSON per Post senden/emfangen Java Basics - Anfänger-Themen 3
L Input/Output JSON Objekt abrufen und ausgeben Java Basics - Anfänger-Themen 9
D JSON Java Basics - Anfänger-Themen 4
R JSON - Ausgabe als HTML mit gson Java Basics - Anfänger-Themen 6
F JSON to JAVA (und vice versa) Java Basics - Anfänger-Themen 2
M JSON Datensätze aus Website in Tabelle Java Basics - Anfänger-Themen 17
C Java, Javascript, Dojox und JSON Java Basics - Anfänger-Themen 4
S JSON String in Object umwandeln Java Basics - Anfänger-Themen 3
Beowend String zu Date parsen Java Basics - Anfänger-Themen 1
W Strings und das parsen Java Basics - Anfänger-Themen 8
R String index out of range: -1 beim Datei Parsen Java Basics - Anfänger-Themen 15
K String nach bestimmtem Muster parsen Java Basics - Anfänger-Themen 3
K Datentypen String zu Integer parsen Java Basics - Anfänger-Themen 2
7.7GradOst Datentypen Stringeingabe aus z.B. "4,d,<" parsen Java Basics - Anfänger-Themen 7
D InputStream parsen und als Bilddatei abspeichern Java Basics - Anfänger-Themen 1
M JAVA String schnell parsen Java Basics - Anfänger-Themen 14
K Methoden Datum parsen Java Basics - Anfänger-Themen 16
V Java Regex richtig parsen Java Basics - Anfänger-Themen 2
J Rekursives Parsen (ohne Reg Expressions) Java Basics - Anfänger-Themen 8
L Beliebigen Datentypen aus String parsen Java Basics - Anfänger-Themen 6
L Datei aus Multipart parsen und speichern, seltsam codiert? Java Basics - Anfänger-Themen 16
S Date parsen klappt nicht richtig Java Basics - Anfänger-Themen 3
M Webseiten Parsen Java Basics - Anfänger-Themen 2
M Input/Output Probleme beim Parsen von CSV und TXT Dateien Java Basics - Anfänger-Themen 7
V Umlaute beim Parsen einer HTML Seite Java Basics - Anfänger-Themen 4
P String parsen Java Basics - Anfänger-Themen 5
S fehler beim datum parsen Java Basics - Anfänger-Themen 6
T Klassen CSV datei einlesen und parsen Java Basics - Anfänger-Themen 4
F Methoden Termin parsen Java Basics - Anfänger-Themen 2
Luk10 String (Hexadezimal) zu int parsen Java Basics - Anfänger-Themen 12
O Nicht Standard Form boolesche Funktion in Standard Form parsen Java Basics - Anfänger-Themen 3
E Datentypen Unvollständiges Datum parsen Java Basics - Anfänger-Themen 8
U Website parsen Java Basics - Anfänger-Themen 11
D Java - OutOfMemoryError beim Parsen Java Basics - Anfänger-Themen 15
J String zu Double parsen (multiple points) Java Basics - Anfänger-Themen 2
K Fehlerbehandlung beim Parsen von Strings Java Basics - Anfänger-Themen 9
F Datum AM / PM parsen Java Basics - Anfänger-Themen 5
A Datentypen Datum mit "May" zu Date parsen Java Basics - Anfänger-Themen 6
F Datum parsen Java Basics - Anfänger-Themen 6
R Datumsformatierung parsen Java Basics - Anfänger-Themen 8
E Code parsen/ formatieren Java Basics - Anfänger-Themen 3
G String parsen Java Basics - Anfänger-Themen 3
J int Wert mit getter holen und in String parsen Java Basics - Anfänger-Themen 5
trash Double Parsen? Java Basics - Anfänger-Themen 3
M Datum parsen Java Basics - Anfänger-Themen 10
A Parsen von double zu int? Java Basics - Anfänger-Themen 2
L String zu Enum parsen Java Basics - Anfänger-Themen 8
L String zuverlässig nach Char parsen? Java Basics - Anfänger-Themen 4
S String KeyEvent parsen Java Basics - Anfänger-Themen 2
D Datum parsen Java Basics - Anfänger-Themen 11
H XML Parsen Java Basics - Anfänger-Themen 7
J HTML mit XPath parsen Java Basics - Anfänger-Themen 7
H Gleichung parsen Java Basics - Anfänger-Themen 10
Spin SAX parsen ..XML not found Java Basics - Anfänger-Themen 2
W String zu Calendar parsen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben