Fonte d'Objet Java en Java Map<String,Object>
Je suis en utilisant org.eclipse.la jetée.util.ajax.JSON pour parser JSON texte.
Mais le JSON.parse(string) méthode produit un Objet et j'en ai besoin que d'une Carte.
En interne, c'est un objet exactement de la catégorie.
Mais comment avez-vous jeté un Objet sur une Carte sans la construction d'un nouveau ou d'obtenir de la décoché fonte d'avertissement?
Actuellement, je n'ai trouvé qu'une solution sans la décoché fonte d'avertissement, mais avec la construction d'une nouvelle Carte, qui est en fait bien sûr pas un casting à tous.
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;
}
Donc, qu'est-il un moyen pour bien lancer sans décoché fonte des avertissements?
la vérification de type avant de conversion de type peut se débarrasser de l'avertissement.
la vérification de type avant n'aide pas
En raison du type d'effacement, vous ne pouvez pas de vérification de type pour un type particulier de générique carte. (Par exemple, vous ne pouvez pas distinguer
J'ai essayé
vous pouvez vérifier au moins que c'est une Carte. Vous aurez toujours une
la vérification de type avant n'aide pas
En raison du type d'effacement, vous ne pouvez pas de vérification de type pour un type particulier de générique carte. (Par exemple, vous ne pouvez pas distinguer
Map<String,Object>
de Map<Integer,Object>
à l'aide de la vérification de type.)J'ai essayé
(object instanceof Map<String,Object>)
et ça ne fonctionne pas, alors que (object instanceof Map)
.vous pouvez vérifier au moins que c'est une Carte. Vous aurez toujours une
raw types
avertissement.
OriginalL'auteur KoichiSenada | 2012-10-17
Vous devez vous connecter pour publier un commentaire.
Le compilateur ne peut pas garantir que le casting est sûr. Puisque vous êtes celui qui fait la garantie, vous devez utiliser
@SuppressWarnings("unchecked")
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/SuppressWarnings.html
@TedHopp points, la façon dont la bibliothèque est censé être utilisé, c'est que vous lancez chaque valeur de la returnd
Object
pour le type que vous savez qu'il est (mais vous pourriez avoir à jeter chaque propriété que vous récupérer) Voir les mappages ici http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.htmlAu point qu'il apporte, c'est que vous êtes garantir que cet objet JSON ne contient d'autres objets JSON (carte pour les objets)
Par conséquent, si, pour une raison quelconque, vous êtes passé l'entrée
Votre code peut échouer avec une défaillance de fonte d'exception lorsque vous essayez
Donc n'oubliez pas, vous êtes l'garantir ce qui se passe dans cette chaîne, vous êtes l'analyse en JSON
Si vous ne pouvez pas garantie, vous ne pouvez pas créer ce getMap la fonction que vous souhaitez. Que vous avez à faire le casting (et
@SupressWarnings
) à l'endroit qui sait quel type d'un objet spécifique.Pour certains type de sécurité lorsque vous travaillez avec JSON, vous devriez en apprendre davantage sur
Ces classes vous permettent de lire JSON directement dans des classes Java
Map
et de la fonte de la valeur de retour de touteget
appel.Mais en réalité, il pourrait y avoir des cas où je ne peux pas garantir la décoché exprimés. Le casting fonctionne uniquement lorsque la chaîne est à l'intérieur de
{}
, tandis que dans d'autres cas, il peut être autre chose qu'une Carte.vous ne pouvez utiliser que votre
getMap
fonction si vous pouvez garantir que l'entrée est au format{a:{...}, b: {...}}
, c'est tout, les propriétés à haut niveau sont des objets JSONcomment utilisez-vous un non-générique de la Carte sans supprimer les avertissements?
Vous se posent la même question que tout le monde l'a déjà dit, il n'y a aucun moyen de le faire. Voir mon explication et les modifications dans ma réponse.
OriginalL'auteur Juan Mendes