Map<String,String>funktioniert nicht richtig

may24

Bekanntes Mitglied
Hallo zusammen

Ich habe da folgendes Problem und suche nur Rat und Hilfe.

Ich lese einen JSON formatierten String ein. Dieser soll dann in ein 'Map<String,String>' Object gewandelt werden zur weiterverarbeitung:

Java:
String stringToParse = "{call:getApplication, appID:1, appName:who-knows}"

Map<String, String> oObj = (Map<String, String>) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(stringToParse);

Wenn ich mir das im Debugger anschaue, so sehe ich aber nach dem "Mapping":
screen1.jpg

... einen Integer !
Die nachfolgende Klasse/Funktion erwartet aber einen String. Jetzt könnte man natürlich hingehen und den Int wieder nach String casten. Aber das ist ja nicht Sinn der Sache ! Ich erwartet das auch wirklich nach <String, String> gemapped wird.

Was kann ich tun damit Java nicht implizit den Typen konvertiert ? Sprich es zwingen den Typ bei 'String' zu belassen ?
 
Java konvertiert keine Typen. Der Jsonmapper erzeugt - korrekt gemäß dem gelieferten Json - einen Integer.

Die parse methode liefert die eine String/Objekt-Map. Generics existieren nur zur Compile-Zeit. Dein Cast konvertiert keine Inhalt sagt nur "Ich bin zu 100% Sicher, dass in dieser Map nur Strings als Werte drinstecken, daher behandle sie zur Compile-Zeit als String/String map". Was hier schlicht falsch ist.

Du hast drei Optionen:
* Den Jsonparser beibringen alles nach String zu mappen
* Nicht komplett parsen, sondern zu Fuß durch das Objekt navigieren und von Hand alles als String lesen
* Die gelieferte Map nehmen und von Hand in eine String/String map transformieren.

Ich weiß nicht ob und wie die erste Variante wirklich geht, ich würde an der Stelle zu der dritten Variante tendieren. (Die gibt allerdings Probleme, wenn verschachtelte Objete drin sind, da wird das nicht mehr klappen)
 
Das Json ist mMn auch einfach ungültig. Die Keys müssen in Anführungszeichen stehen, wie auch die Strings
na das ist nicht weiter schlimm da der Parser auch : "ACCEPT_NON_QUOTE" macht.

Du hast drei Optionen:
* Den Jsonparser beibringen alles nach String zu mappen
Nun, es gibt "USE_INTEGER_STORAGE" ... nur weiß ich nicht wie ich das auf "false" setzen könnte und was das Ganze dann für Auswirkungen hat ?
Sprich: werden danach die Integer als Strings behandelt ... oder als Objekte ... oder ganz was anderes ?
JSONParserBase.java

Ich weiß nicht ob und wie die erste Variante wirklich geht, ich würde an der Stelle zu der dritten Variante tendieren. (Die gibt allerdings Probleme, wenn verschachtelte Objete drin sind, da wird das nicht mehr klappen)
Verschachtelte Objekte sollte es "eigentlich" nicht geben 😉

Ich habe das Problem erst mal so gelößt:
Java:
Map<String, String> oObj;
oObj = new HashMap<String, String>();
JSONObject jsonObj = (JSONObject) new JSONParser(JSONParser.MODE_PERMISSIVE).parse(stringToParse);
for (Object key : jsonObj.keySet()) {
    Object value = jsonObj.get(key);
    oObj.put(key.toString(), value != null ? value.toString() : null);
}
 

Zurück
Oben