Array Element auslesen

U

umwelt

Neues Mitglied
0
Hallo,

ich habe in einer App, die ich gerade entwickele, ein List-Array mit paar tausend Einträgen (bitte keine Diskussion dazu :)).
Es ist ein Nachschlagewerk bei dem man zu Wörtern zugehörige Infos erhält.

Die Einträge sehen etwa so aus:

Code:
e['taube']['group'] = "Vogel";
e['taube']['infos'] = "Infos über Tauben";
e['taube']['flag'] = 1;

e['elefant']['group'] = "Elefant";
e['elefant']['infos'] = "Infos über Elefanten";
e['elefanten']['flag'] = 0;

usw.

Nun komme ich irgendwie nicht weiter...
Ich möchte natürlich auf das jeweilige element zugreifen.

wenn jemand "elefant" eingibt, möchte ich die Infos dafür auslesen.

Dafür versuche ich mit list.get("elefant") etwas zu erhalten... das klappt aber nicht, weil get ein int erwartet...

Ich komme grad nicht weiter und weiß nicht so recht, wonach ich suchen sollte...

Jemand einen Tipp?
 
In dem Fall wäre wohl Map statt ArrayList die bessere Wahl. Oder wenn deine Schlüssel (Wörter) garantiert eindeutig sind, dann wäre eine Hashtable zu bevorzugen.

Und dort speicherst du dann Objekte in denen du die Daten hältst und nicht ungeordnet primitive Datentypen.
 
Hallo Thyrion,
danke für die Antwort - ich bin zwischenzeitlich schon auf eine HashMap umgestiegen.
Müsste auch gehen, oder?

Nun habe ich ein Array mit oben genanntem Aufbau und möchte es der HashMap zufügen.

Ich mache das bisher so (ich teste erstmal mit Strings, bevor ich die Array als value reinlade):

Code:
HashMap map = new HashMap<String, String>();

JSONArray jsonArray = new JSONArray(jsonString); // Erstellt Array aus JSON-String

            for (int i=0; i<jsonArray.length(); i++) {
                map.put(jsonArray.get(i).toString(), "test");
            }

Bloß wenn ich dann nach map.size() schaue, ist die 0...
Das scheint nicht zu ufnktionieren... was mache ich denn falsch?

Viele grüße!
 
Ist dein jsonString wirklich ein Array?
 
Was sagt Logcat wenn du das ausführst?

Code:
HashMap map = new HashMap<String, String>();
JSONArray jsonArray = new JSONArray(jsonString); 

[B]Log.e("WICHTIG --- WICHTIG", "jAry-Länge: " + jsonArray.length());[/B]

            for (int i=0; i<jsonArray.length(); i++) {
                map.put(jsonArray.get(i).toString(), "test");
            }
 
"Array als value reinlade".... Wieso nicht ein schönes Objekt, mit dem du einfachen Zugriff auf die jeweiligen Informationen hast? Und wenn es wirklich in JSON vorliegt, dann sollte das auch nicht das Problem sein, daraus saubere Objekte zu erzeugen.
 
Hallo,

ich habe den JSON-String nochmal geändert, so dass ie ganzen key-strings wegfallen und numerisch sortiert wird.

Code:
e['taube'][0] = "Vogel"
e['taube'][1]="Infos über Tauben"
e['taube'][2]=1

usw.

Da wurde eine exception geworfen, weil das kein array ist. Habe also ein jsonobject erstellt, das die länge 3 hat - was meinen testdaten entspricht.

Soweit klappt das also.

Nun möchte ich aber aus diesem JSON-Objekt eine HashMap erzeugen.
Und das will einfach nicht so wie ich das will.

Mein Versuch:
Code:
Iterator<String> iter = jsonObject.keys();

            while(iter.hasNext()) {
                String key = iter.next();

                    try {
                        Object value = jsonObject.get(key);

                        showMessage("Gefunden key: "+key+", Value: "+value);
                    }
                    catch (Exception e) {
                    showMessage("iteration wirft exception");
                    }
            }

Nur:
aks Key wird mit der numerische Index angegeben, z. B. 1

Wenn ich das in die HashMap einfügen möchte, brauche ich aber einen String als Key.
--> wie bekomme ich den? Er ist im Objekt ja enthalten, bloß ich kriege es einfach nicht raus, wie...
wenn ich den Key habe, kann ich ja per
Code:
myMap.put(string, objekt)
die Daten einfügen.

Viele Grüße!

Der ursprüngliche Beitrag von 16:17 Uhr wurde um 17:11 Uhr ergänzt:

Update:
Ich habe es jetzt hinbekommen, dass daten in die hashmap eingetragen und abgefragt werden können. puh!

Es wird aber noch falsch eingetragen... ;)

Code:
map.put(key, jsonObject.get(key));

damit kann ich per map.get("blab") den Eintrag zu "blab" bekommen.

Code:
infos = map.get(i);

Allerdings erhalte ich da einen JSON-String und kein Objekt.

ergibt etwa

Code:
["Vogel","Lebt in Städten",1]

stattdessen möchte ich natürlich nur auf den ersten Eintrag zugreifen... dass ich "Vogel" bekomme.

Kann mir jemand weiterhelfen?
 
Offenbar verrennst du dich gerade völlig:

Ein Array ist dazu da, gleichartige(!) Dinge indexbasiert abzulegen. Das, was du unter e['vogel'] ablegst ist aber heterogen. Da bietet sich ein JSON Objekt (wie du das angangs mit Feldern group infos und flag ja gemacht hast) viel eher an.

Du müsstest eher anstatt 'vogel' und 'elefant' Indizes verwenden. Du hast ein "arme Leute" Mapping implementiert, indem du die Objekt-Felder als Schlüssel benutzt. Das ist nicht unbedingt falsch, aber so ist nirgends festgelegt, wer denn index 0 hat: der vogel oder der elefant. (Intern wird das de facto gehasht)
 
Hallo,

hier mal ein update zum aktuellen Stand:

Ich möchte per map.get("Taube") ein Array mit den Infos zur Taube bekommen. Die Haupt-Daten liegen allgemein in einer HashMap, deren value jeweils ein Array ist. Das klappt auch und ist, soweit ich diversen Tutorials entnehmen konnte, ein sauberer Weg!

Mein JSON sieht aktuell so aus:

Code:
{"Taube":["Stadtvogel","1","1"],"Elefant":["Ruesseltier.","1","1"],"Ente":["Wassertier","1","1"]}
Ich bekomme es nur nicht hin, die einzelnen Daten in ein normales Array umzuwandeln, das ich der HashMap dann per put() mitgeben kann.

Was ich jetzt testweise gemacht habe, ist:

Erzeugung der HashMap:
Code:
private HashMap getHashMapFromJson(String jsonString) {

    HashMap map = new HashMap<String, JSONArray>();
        try {
        JSONObject jsonObject = new JSONObject(jsonString);
        Iterator<String> iter = jsonObject.keys();

            while(iter.hasNext()) {
                String key = iter.next();

                    try {
                        JSONArray value = jsonObject.getJSONArray(key);
                        String[] arrayVal = new String[value.length()];

                            for(int n=0;n<value.length();n++) {
                            arrayVal[n] = "Element "+n;
                            }

                        map.put(key, arrayVal);
                    }
                    catch (Exception e) {
                    showMessage("iteration wirft exception: "+e.getMessage());
                    }
            }
        }
        catch (Exception e) {
            showMessage("Fehlermeldung hashmap: "+e.getMessage());
        }
    return map;
    }
Auch das klappt.

Wie man an der Stelle sehen kann
Code:
arrayVal[n] = "Element "+n;
gebe ich erstmal nur Dummy-Elemente aus, um zu schauen, ob die HashMap und weitere Verarbeitung funktioniert. und das tut sie. Da kann der Fehler nicht liegen.

Was ich möchte, ist in Pseudocode:

Code:
...
JSONArray value = jsonObject.getJSONArray(key);
        String[] arrayVal = new String[value.length()];

                 for(int n=0;n<value.length();n++) {
                 arrayVal[n] = value.get(n);
                 }

        map.put(key, arrayVal);
...
Und das geht nicht, weil mir value.get(n) ein Objekt zurück liefert.

Unter http://stackoverflow.com/questions/1568762/accessing-members-of-items-in-a-jsonarray-with-java ist die Rede von getString("Name"), aber ich habe nur ein normales Array mit numerischen indizes, keine Strings als key... also ist so ein Zugriff nicht möglich.

wenn ich es per (String[]) caste, klappt auch das nicht...
Wie bekomme ich denn die Daten aus dem JSONArray in das String[]-Array des jeweiligen HashMap-Eintrags?

EDIT: habe es jetzt glaub hinbekommen: nicht get() sondern getString();


Viele Grüße!
 
Zuletzt bearbeitet:
umwelt schrieb:
Ich möchte per map.get("Taube") ein Array mit den Infos zur Taube bekommen.
Nein! Bei einem sauberen Design würdest du ein Objekt (vielleicht mal als Wochenendlektüre: Objektorientierte Programmierung) mit den Infos haben wollen und kein Array.

Das Objekt hätte dann in deinem Fall die Eigenschaften "group" (Zeichenkette), "infos" (Zeichenkette), "flag" (Ganzzahl oder Bool'scher Ausdruck, je nachdem ob nur 0 und 1 oder andere Werte möglich sind) - über die Bezeichner kann man sicherlich streiten, ich habe die aus deinem 1. Post übernommen.
 
Zuletzt bearbeitet:
Also wenn ich dich richtig verstanden habe, willst du assoziatives array, was in Java eine map ist! Das hast du nun ja schon umgesetzt. Nur willst du wirklich ein jsonarray abspeichern? Bzw du willst aus dem jsonarray ein normales array machen? Vergiss diesen Ansatz wieder, da hast du nen ziemlichen Knoten im Kopf. Wie thyrion sagte, verwende für die Daten objekte. Du gehst einfach dein jsonarray durch und erzeugst für jeden Eintrag ein objekt welches du dann zur map hinzufügst.
 
Ich schließe mich Thyrion an. Du willst eine Map von String nach Animal (oder so).
Und in Animal hast du dann deine 3 Werte mit richtigen Typ auf die du sofort zugreifen kannst.

Zum Deserialisieren von JSON schau dir mal gson von Google an. Damit kannst du aus deinem JSON sofort das passende Objekt machen.
 

Ähnliche Themen

R
Antworten
6
Aufrufe
1.016
swa00
swa00
H
Antworten
2
Aufrufe
1.311
Hcman
H
L
Antworten
4
Aufrufe
1.338
lonnie9020
L
Zurück
Oben Unten