Ignorer l'élément racine lors de la désérialisation de json
Comment dois-je désérialiser JSON suivants pour sauter de l'élément racine et analyser simplement la partie intérieure de cette JSON. J'aimerais éviter de créer d'autres, 3ème classe Root
qui serait composé uniquement de MapWrapper
champ.
{
"root": {
"language": "en",
"map": {
"k1": {
"name": "n1",
},
"k2": {
"name": "n2",
}
}
}
}
Donc j'aimerais n'avoir que ces deux classes:
class MapWrapper {
private String language;
private Map<String, MyMapEntry> map;
}
class MyMapEntry {
String name;
}
source d'informationauteur Mateusz Chromiński
Vous devez vous connecter pour publier un commentaire.
vous pouvez utiliser
GSON
Bibliothèque pour cela.Code ci-dessous permettra de résoudre votre problème.
Considérer le JSON suivants:
La DTO pour cette JSON sans l'élément racine
Convertir/JSON en utilisant les méthodes suivantes (vous pouvez soit garder présent à l'intérieur de DTO ou une autre classe d'aide)
Ce qui est optimal code pour le faire en une seule passe.
MapWrapper
classeMyMapEntry
classeLa Coutume Deserializer
Enregistrer avec GSON
Maintenant deserialise avec code suivant
Ma réponse est la fin de cette partie.
Une fois que nous parser le Json, le conteneur est toujours va être un JsonObject sous-classe de JsonElement. Ainsi, si nous voulons l'ignorer, nous avons juste besoin de le jeter à ses sous-classe et de saisir le champ de la tenue de notre intérieur de la classe.
Remarque: JsonObject et JSONObject sont des classes différentes (utilisation de la com.google.Json à l'importation).
Vous peut généraliser cette réponse plus tel que vous ne l'auriez pas besoin de connaître le nom de l'intérieur de la classe. Vous voulez faire cela simplement en obtenant le seul champ de l'objet conteneur. Cependant, je ne vois aucun moyen de le faire autre que le démarrage de l'itérateur, il n'y a pas de getValue(atIndex) méthode je peux voir, et je pense que le départ d'un itérateur est probablement moins efficace que de simplement en regardant le champ par son nom (mais peut-être tort).
La méthode de l'itérateur ressemble:
Vous pourriez désérialiser dans un
Map<String, MapWrapper>
.Inspiré par Gustav Carlson idée, j'ai décidé de l'étendre à un échantillon de béton. Voici un test junit que les tests de parsing JSON comme Carte.