Cast Java-Objekt in Java Map<String,Object>
Ich bin mit org.eclipse.jetty.util.ajax.JSON zum Parsen der JSON-text.
Aber die JSON.parse(string) Methode erzeugt ein Objekt und ich brauche es als eine Karte.
Intern ist es ein Objekt von genau der genannten Klasse.
Aber wie du wirkst, die ein Objekt in eine Map ohne Errichtung einer neuen oder die unchecked cast Warnung?
Derzeit, die ich gefunden habe, nur eine Lösung ohne den unchecked cast Warnung, sondern mit der Errichtung einer neuen Karte, das ist eigentlich natürlich nicht ein casting überhaupt.
private Map<String,Object> getMap(String string) {
HashMap<String,Object> result = new HashMap<>();
Object object = JSON.parse(string);
if (object instanceof Map) {
Map<?,?> map = (Map)(object);
for (Map.Entry<?,?> entry : map.entrySet()) {
String key = entry.getKey().toString();
Object value = entry.getValue();
result.put(key,value);
}
}
return result;
}
Also, ob gibt es eine Möglichkeit, um richtig zu wirken, ohne unchecked cast Warnungen?
- Typ-überprüfung vor der Typumwandlung möglicherweise loswerden der Warnung.
- Typ-checking ist nicht zu helfen
- Weil der type erasure, Sie nicht Tippen können überprüfen für eine bestimmte Art von generische Karte. (Zum Beispiel, Sie können nicht unterscheiden
Map<String,Object>
ausMap<Integer,Object>
mit Typ-überprüfung.) - Ich habe versucht
(object instanceof Map<String,Object>)
und es funktioniert nicht, während(object instanceof Map)
tut. - Sie können zumindest überprüfen, es ist eine Karte. Sie haben immer noch eine
raw types
Warnung. Map<String,Object> map = (Map)(object)
- nichtMap<?,?> map = (Map)(object)
- Werke- Gibt es einen Weg, um sicher zu überprüfen und warf einen
Map<?,?>
in eineMap<String,Object>
in Java? - Nein. Die Laufzeit, die nicht wissen, generische Typen. Es gibt keine Möglichkeit zu sagen, wenn ein unbekannter
Map
Karten ausString
s zuObject
s. - Wenn Sie möchten, geben Sie sicher, Sie können nicht hinzufügen nichts auf der Karte und du bekommst sind
Object
s. - Der einzige sichere Typumwandlungen sind downcasts, wie beim casting von
String
zuObject
, aber nicht vonObject
zuString
. Da jeder string ist ein Objekt, aber nicht jedes Objekt ist ein string
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der compiler kann nicht garantieren, dass der cast sicher ist. Denn Sie sind derjenige, der-Garantie, sollten Sie
@SuppressWarnings("unchecked")
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/SuppressWarnings.html
Als @TedHopp Punkte heraus, die Art und Weise, dass die Bibliothek verwendet werden soll, ist, dass du wirkst, jeder Wert in der returnd
Object
auf die Art wissen Sie, es ist (aber Sie hätten die Darsteller alle Eigenschaft, die Sie abrufen) die Zuordnungen hier http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.htmlDem Punkt, dass es bringt, ist, dass Sie garantieren, dass dieses JSON-Objekt enthält nur die anderen JSON-Objekte (Karte der Objekte)
Daher, wenn aus irgendeinem Grund Sie ' re übergeben die Eingabe
Würde Ihr code nicht mit einem invalid cast exception, wenn Sie versuchen
Denken Sie also daran, du bist die einzige Garantie, was geht in diesem string sind Sie in das JSON-parsing
Wenn Sie nicht garantieren können, können Sie auch nicht erstellen, dies getMap-Funktion, die Sie möchten. Sie haben zu tun, das casting (und die
@SupressWarnings
) an der Stelle, die weiß, was der Typ eines bestimmten Objekts ist.Sich für eine Art Sicherheit bei der Arbeit mit JSON, sollten Sie lernen, über
Diese Klassen ermöglichen das Lesen von JSON direkt in Java-Klassen
Map
und warf den return-Wert aus einerget
nennen.{}
, während in anderen Fällen könnte es etwas anderes sein als eine Karte.getMap
Funktion, wenn Sie garantieren können, dass die Eingabe im format{a:{...}, b: {...}}
alle, der Eigenschaften auf der obersten Ebene sind JSON-ObjekteMap<?,?>
(oder gleichwertigMap<Object,Object>
).Map<Object,Object> map = (Map)(object);
gibt der "Unkontrollierten Zuordnung.Map<Object,Object> map = (Map<Object,Object>)(object);
gibt die "Unchecked cast"Map<?,?> map = (Map)(object);
funktioniert gut, aber doesn ' T geben Sie die Typen der Schlüssel und Werte.Map
oderString
oder etwas anderes, aber es ist typisiert alsObject
(object instanceof Map)
und dann sicher niedergeschlagen ein Objekt in einer Karte oder Map<?,?> noch. Aber ist es möglich, sicher niedergeschlagen ein Objekt in eine Map<String,Object>?