8
votes

GSON: Comment déplacer les champs vers l'objet parent

J'utilise Google Gson pour transformer mon objet Java à JSON. < p> Actuellement, j'ai la structure suivante: xxx

actuellement un Durée est à l'intérieur d'un objet objet . Je tiens à sauter les données objet et déplacez l'objet de la durée dans l'objet d'étape , comme ceci: xxx

Comment puis-je faire cela à l'aide de gson?

Edit: J'ai essayé d'utiliser un typeyeadapter pour modifier l'étape.class, mais dans la méthode d'écriture, je ne suis pas capable Pour ajouter mon objet de durée au JSONWriter.


0 commentaires

4 Réponses :


0
votes

Je ne pense pas qu'il y a une belle façon de le faire dans le Gson. Peut-être obtenez un objet Java (carte) à partir de JSON initial, supprimez les données, mettez la durée et Serialize à JSON:

Map initial = gson.fromJson(initialJson);

// Replace data with duration in this map
Map converted = ...

String convertedJson = gson.toJson(converted);


0 commentaires

6
votes

Vous pouvez probablement faire cela en écrivant, puis enregistrer un Serializer personnalisé pour étape code>, et en vous assurant de l'intérieur, vous travaillez avec Durée code> etc., au lieu de de données code> .

class StepSerializer implements JsonSerializer<Step>
{
  public JsonElement serialize (Step src,
                                Type typeOfSrc,
                                JsonSerializationContext context)
    {
      Gson gson = new Gson ();
      /* Whenever Step is serialized,
      serialize the contained Data correctly.  */
      JsonObject step = new JsonObject ();
      step.add ("start_name", gson.toJsonTree (src.start_name);
      step.add ("end_name",   gson.toJsonTree (src.end_name);

      /* Notice how I'm digging 2 levels deep into 'data.' but adding
      JSON elements 1 level deep into 'step' itself.  */
      step.add ("duration",   gson.toJsonTree (src.data.duration);
      step.add ("distance",   gson.toJsonTree (src.data.distance);
      step.add ("location",   gson.toJsonTree (src.data.location);

      return step;
    }
}


8 commentaires

Il suffit de Serialize , donc désérialisze n'est pas important. Ce qui précède était juste un exemple de ma structure. En fait, mon objet de données contient des champs supplémentaires, qui doivent être inclus dans le tojsontree . Un indice comment je peux faire ça?


Ceci vraiment dépend. Montrez un exemple avec deux champs supplémentaires et je vais voir ce que je peux penser. CAVEAT: Ma réponse est basée sur la documentation du GSON. Je n'ai jamais fait de choses étranges comme ça avant.


J'ai mis à jour ma question avec des champs supplémentaires dans l'objet Data-Object.


@Dennismadsen - J'ai mis à jour ma réponse pour refléter votre changement. Bonne chance.


Merci. Existe-t-il un moyen de créer la variable de l'étape SRC et de supprimer simplement son objet de données? Si cela est possible, je n'aurais plus d'ajouter le nom de départ et de fin.


@Dennismadsen - Il y a un moyen de le faire en utilisant supprimer . Je recommande vivement le reste de la documentation de l'API pour JSONObject également.


@Dennismadsen - Avez-vous réellement implémenté le sérialisateur et voyez-vous que cela fonctionne pour vous, avant de marquer cette réponse correcte? Je ne suis pas trop sûr parce que tout ce que j'ai écrit est basé sur la documentation du GSON. Je n'ai pas testé une seule ligne de code que j'ai écrit, bien que le espère est que c'est assez correct.


Oui je l'ai fait. Il a presque fonctionné sauf du fait que j'ai créé un emplacementApactorfactory qui modifie tous les emplacements de mon arbre JSON, mais lorsque j'ajouterai manuellement un emplacement, il semble que cela ne soit pas changé par mon LocationAdapterFactory .



0
votes

courut dans le même problème. La réponse de @arjunshunkar m'a pointé dans la bonne direction. J'ai corrigé la rédaction d'un sérialisateur personnalisé, mais légèrement différent:

public class StepSerializer implements JsonSerializer<Step> {
    @Override
    public JsonElement serialize(Step src, Type typeOfSrc, JsonSerializationContext context) {
        JsonObject step = new JsonObject();
        step.add ("start_name", context.serialize(src.start_name);
        step.add ("end_name",   context.serialize(src.end_name);

        JsonObject data = context.serialize(src.data).getAsJsonObject();
        data.entrySet().forEach(entry -> {
            step.add(entry.getKey(), entry.getValue());
        });

        return step;
    }
}


0 commentaires

1
votes

Dans ce cas, je vous enregistrer typeeadapter pour les données non imbriquées . Dans l'adaptateur Les champs S sont ajoutés à l'objet parent. Pas besoin de créer un adaptateur pour la classe enfermer. XXX


0 commentaires