# JSONObject auslesen und in HashMap hinterlegen



## XHann3sX (31. Mai 2017)

Hi,

ich habe eine Frage zum Thema JSON undzwar wollte ich einen JSON-String der u.a 2 Arrays enthält die eine unbekannte Anzahl an Objekten beinhaltet und diese möchte ich auslesen und die Werte der Objekte in einer HashMap speichern das JSON-Array sieht in etwa so aus

```
"array":[ 
      { 
         "id":"12000",
         "price":68
      },
      { 
         "id":"12400",
         "price":19
      }
   ]
```

Und hier möchte ich die Werte herauslesen mit unter Nutzung dieser Libary code.google.com/archive/p/json-simple/
Weil ich dachte das das damit einfach geht , wegen simple, geht es aber nicht. Ich erhalte Excpetions , wenn ich die Einträge des Arrays als JSONObject parsen will etc, kennt jemand eine Alternative Möglichkeit habe schon einige bei Stackoverflow gesehen , die machen aber nicht wirklich das was ich vorhatte

MFG
Hannes


----------



## mrBrown (31. Mai 2017)

Wie willst du denn die Werte in einer Map unterbringen, id als Key und price als Value?
Wenn ja, wirst du da selber was basteln müssen, irgendeine Lib wird nicht das Schema in deinen Daten sehen und id als Schlüssel für die anderen Daten erkennen


----------



## XHann3sX (31. Mai 2017)

Nein jeden Eintrag einzelnd , das Array selbst ist in echt größer 
Ehrlich wie 
KEY "id"  VALUE 12000
KEY "price" VALUE 68 
Value sollte dann ein Objekt sein und wird dann nachher richtig geparst


----------



## mrBrown (31. Mai 2017)

Das geht damit schon, wird aber zur Cast-Hölle..."simple" heißt nicht unbedingt, dass es schön zu benutzen ist 


```
((Map) ((JSONArray) ((JSONObject) new JSONParser().parse(json)).get("array")).get(0)).get("id")
```


Hast du dir mal GSON angeguckt?


----------



## XHann3sX (31. Mai 2017)

Ja aber nie ganz verstanden, wie ich das anstellen soll, habe deswegen auf simple gewechselt, aber ich werde es mir Mal genauer anschauen Danke !


----------



## mrBrown (31. Mai 2017)

Einfach gesagt: du baust dein Json-Struktur mit Java-Klassen nach.
In deinem Beispiel kann das zB ein `Map[]` sein, und das lässt sich dann parsen mit:

```
String json = "[ \n" +
        "      { \n" +
        "         \"id\":\"12000\",\n" +
        "         \"price\":68\n" +
        "      },\n" +
        "      { \n" +
        "         \"id\":\"12400\",\n" +
        "         \"price\":19\n" +
        "      }\n" +
        "   ]";

Gson gson = new Gson();
Map<String,String>[] array = gson.fromJson(json, Map[].class);
```

Map halte ich hier aber für ungeeignet, besser passen da direkt passende Objekte


----------



## XHann3sX (31. Mai 2017)

Naja , die Objekte können aber sehr umfangreich sein und es gibt schon extra eine Methode , die das Objekt aus dieser HashMap erstellt , da nicht immer alle Value enthalten sind


----------



## mrBrown (31. Mai 2017)

Die Objekte brauchst du doch so oder so?
Und ob alle Werte enthalten sind, ist bei GSON egal. Man spart sich halt das selber Parsen/erstellen der Objekte


----------



## XHann3sX (31. Mai 2017)

Hä? Wenn ich eine Mal mit den Keys und den Werte habe ,kann ich durch das aufrufen einer Methode daraus das gesamt Objekt erstellen, ohne das ich da irgendwas machen muss, das ist für mich die kürzeste Methode, aber ich werde es Mal so Versuche  Danke !


----------



## mrBrown (31. Mai 2017)

Wie erstellst du denn mit einem Methodenaufruf aus einer Map ein Objekt? 
Das ist entweder ein Haufen if/switch oder viel Reflection, aber nichts simples...


----------



## XHann3sX (31. Mai 2017)

Naja , ist ne API wie genau, weiß ich nicht , er fasst die Meta-Daten wohl irgendwie zusammen . Naja aber auch egal, die Methode  funktioniert, etwas eigenes zu erstellen ist nicht nötig 

Edit Bei deinem Code-Snippet wird da die gesamte Json in eine HashMap geschrieben ? Weil ich müsste jeden Eintrag durchiterieren und für jeden eine eigene HashMap erstellen


----------



## RalleYTN (1. Jun 2017)

Ich arbeite selber mit json-simple.
Du hast ein Array was geparst werden soll und möchtest es als Map darstellen.
Das id Attribut der einzelnen Elemente soll als Key und das price Attribut als Value interpretiert werden.
Ist eigentlich recht simpel.


```
Map<String, Integer> map = new HashMap();
((JSONArray)new JSONParser().parse(/* Quelle des JSON */)).forEach(element -> {

    JSONObject object = (JSONObject)element;
    map.put((String)object.get("id"), ((Number)object.get("price")).intValue()); // Zahlenwerte immer erst in Number casten weil die API sonst Probleme macht.
});
```

Gerne nochmal in langer Form um die Schritte besser nachvollziehen zu können.

```
Map<String, Integer> map = new HashMap<>();
JSONParser parser = new JSONParser();
JSONArray array = (JSONArray)parser.parse(/* Quelle des JSON */);

for(Object element : array) {

    JSONObject object = (JSONObject)element;
    String id = (String)object.get("id");
    int price = ((Number)object.get("price")).intValue();
    map.put(id, price);
}
```


----------



## mrBrown (1. Jun 2017)

RalleYTN hat gesagt.:


> Das id Attribut der einzelnen Elemente soll als Key und das price Attribut als Value interpretiert werden.


Laut #3 nicht, sondern "id" als Key, und der entsprechende wert als Value, und "price" als key, und der entsprechende Wert als Value, usw...


----------



## RalleYTN (2. Jun 2017)

mrBrown hat gesagt.:


> Laut #3 nicht, sondern "id" als Key, und der entsprechende wert als Value, und "price" als key, und der entsprechende Wert als Value, usw...


Dann könnte man das JSONObject direkt als Map nehmen.


----------



## mrBrown (2. Jun 2017)

RalleYTN hat gesagt.:


> Dann könnte man das JSONObject direkt als Map nehmen.


Joa, so wie in #4


----------



## XHann3sX (3. Jun 2017)

Danke für eure Antworten, meine Email-Benachrichtigungen haben irgendwie nicht funktioniert, naja da sich ein Problem mit dem deserialisieren einige Objekete ergen hat, bin ich auf Base64 encoding umgestiegen und encodiere damit jetzt das gesamte Objekt Trotzdem danke für euere Antworten


----------



## mrBrown (3. Jun 2017)

Deserialisierung und Base64 haben aber doch gar nichts miteinander zu tun?


----------

