4
votes

Comment convertir des champs JSON en une carte JAVA à l'aide de GSON

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:

  1. Classe Alertes qui contient les champs suivants - état, date, heure, description et classe Labels .

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


0 commentaires

3 Réponses :


3
votes

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);


0 commentaires

3
votes

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


0 commentaires

1
votes

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


0 commentaires