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 <...>