J'ai une donnée JSON qui ressemble à ceci:
public class Labels { // I want to parse all the fields (field1, field2, etc) into // this map Map<String, String> fields = new HashMap<>(); }
Dans mon code Java, j'ai deux classes:
Classe Alertes
qui contient les champs suivants - état, date, heure, description et classe Labels
.
La classe interne Labels
qui est censée contenir tous les champs de field1
à field100
(et plus) p >
J'analyse ce JSON en GSON comme ceci:
Alerts myAlert = gson.fromJson(alertJSON, Alert.class);
Le code ci-dessus analyse le JSON dans l'objet Alert
et l'objet Labels
.
Question:
Au lieu de mapper les champs ( field1
, field2
, etc.) à l'intérieur de l'objet Labels en tant que champs String individuels, comment puis-je les analyser dans une carte?
Par exemple, l'objet Labels ressemblerait à ceci:
{ "status": "status", "date": "01/10/2019", "time": "10:30 AM", "labels": { "field1": "value1", "field2": "value2", ... "field100": "value100" } "description": "some description" }
Comment faire cela?
3 Réponses :
Vous pouvez utiliser TypeToken pour spécifier directement des étiquettes.
import java.lang.reflect.Type; import com.google.gson.reflect.TypeToken; Type mapType = new TypeToken<Map<String, String>>(){}.getType(); Map<String, String> myMap = gson.fromJson("{'field1':'value1','field2':'value2'}", mapType);
Déclarer un objet d'alerte comme celui-ci:
Alert myAlert = gson.fromJson(alertJSON, Alert.class); System.out.println(myAlert.getLabels());
fonctionne pour moi et ce code
public class Alert { private String description; private String status; private Map<String, String> labels; ... }
imprime la carte sous la forme {field1 = valeur1, champ2 = valeur2, champ100 = valeur100}
Pour qu'aucun objet intermédiaire ne soit requis
Pour les cas généraux - un moyen plus flexible: gson peut enregistrer les adaptateurs de type:
public class LabelsDeserializer implements JsonDeserializer<Labels> { @Override public Labels deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { if (!jsonElement.isJsonNull()) { Labels label = new Labels(); jsonElement.getAsJsonObject().entrySet().forEach(entry -> label.getFields().put(entry.getKey(), entry.getValue().getAsString())); return label; } else { return null; } } }
Et le désérialiseur pour votre cas est:
Gson gson = new GsonBuilder().registerTypeAdapter(Labels.class, new LabelsDeserializer()).create();
Pour la sérialisation, il est nécessaire d'implémenter JsonSerializer <...>